Почему эти модифицированные алгоритмы пузырьковой сортировки не создают тот же порядок в python3?

#python-3.x #list #algorithm #bubble-sort

#python-3.x #Список #алгоритм #пузырьковая сортировка

Вопрос:

Цель: упорядочить список только по первым двум символам, при сравнении двух элементов из списка, если они совпадают, сохранить исходный порядок.

Фрагмент # 1

 l= []
for i in range(int(input())):
    l.append(input().split())

    for i, j in enumerate(l):
        for b, c in enumerate(l[:-1]):
            if l[b][:2] > l[b 1][:2]:
                l[b],l[b 1] = l[b 1], l[b]
l = [x[0] for x in l]
print( 'n'.join(str(p) for p in l))
 

Вывод из # 1:
Элементы расположены в алфавитном порядке при рассмотрении всего текста, но я хочу рассмотреть только первые два символа каждой строки и сравнить их. Когда они совпадают, я хочу исходный порядок тех, которые сравнивались.

введите описание изображения здесь

Фрагмент # 2

 l = ['Hilbert','Godel','Poincare', 'Ramanujan','Pochhammmer']
for i, j in enumerate(l):
    for b, c in enumerate(l[:-1]):
        if l[b][:2] > l[b 1][:2]:
            l[b],l[b 1] = l[b 1], l[b]
#l = [x[0] for x in l]
print( 'n'.join(str(p) for p in l))
 

Вывод из # 2:
Этот результат — то, что я ожидал.

введите описание изображения здесь

Комментарии:

1. Какая часть любого фрагмента кода налагает какой-либо конкретный порядок, если первые 2 символа одинаковы?

2. @ScottHunter даже если бы я сделал что-то подобное, результат противоречив: def first_letters(word): возвращает word[:2] l= [] для i в диапазоне(int(input())): l.append(input().split()) r = sorted(l, key=first_letters, reverse=False) печать (r)

3. Какая часть вашего кода предназначена для устранения этой «несогласованности»?

Ответ №1:

В первом алгоритме при использовании .split() вы создаете список списков. Итак, ваша переменная (l) равна: [[‘Hilbert’], [‘Godel’], [‘Poincare’], [‘Ramanujan’], [‘Pochammer’]] (извините, если я неправильно написал) поэтому, когда вы спрашиваете l [b] [: 2] вызапрашиваются первые два элемента списка [‘Poincare’], который является списком в позиции b вашего начального списка, и он равен [‘Poincare’] . Поэтому, когда он доходит до [‘Poincare’]> [‘Pochammer’], он выдает ‘True’. Учитывая, что ваши списки состоят только из одного элемента (например. [‘Hilbert’]) он может сортировать их правильным образом, и единственная проблема связана с [‘Poincare’] — [‘Pochammer’] В следующий раз просто не используйте .split() в этой ситуации, а попробуйте использовать l.append(input(«)) . .split() лучше использовать для чего-то вроде ‘A B C D E’.split() или что-то в этом роде.