Сортировка списка строк по индексу

#python

#python

Вопрос:

у меня есть текстовый файл, полный символов и чисел в виде строки. Я пытаюсь переместить его в другой список, где он сортируется после номера индекса. Но я новичок в python и не совсем уверен, как это сделать. Я в своем «a» создал кортеж i и отделил int от строки. Теперь я хочу выполнить сортировку по целым числам.

 sortedlist = []
with open("m_scrambled.txt") as file:
    for line in file:
            a = (int(line.partition(" ")[0]),line.partition(" ")[2])
            b=sorted(a)
            print(a)
  

ошибка, которую я получаю, пытаясь отсортировать по «a».

 '<' not supported between instances of 'str' and 'int'
  

фрагмент файла, я надеюсь, вы можете помочь мне стать умнее в этом!

 150                                                                                                                                  
139                                        ,W@@@@@@@@@####*;;####@@@W@@@@##Wii;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::,,,,,,,,,:::
140                                        .xWW@@W@@@@##W ;;;; W@@WWWWW@@##Wi;i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::;;;::
141                                        ` @@@@@@@####Wii;;;iW###@@@@@###ni;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::,,,...``
138                                    `,;*n@@@@@@########i:;x###@@@@######@#;iii;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::,,..```...
146                                   .#xxxMWWWW@#######@n#  #n@#######@@WMMWWWWz;;;;;;;;;;;;;;;;;;;;;;:,.``                         
137                                 `: zxMMMMMMMMMMWW@@##@:,,x##############W*iii;;;i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::,,..```   
147                                 ``. W@@@@@@@####Wxnz  ****  znxW####@@@@@#@@z*iiii;;;;;;ii;;;;:,.``                              
142                                 `````.iM############Wi;;;;*W############M ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:,,...``       
136                               `; zzznnxnnnnnnnxxxxxMMMxxxMMMMMMMMMMWWWWWWWWWMxz i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::,,,..``    
148                               ``.,;nW@@@@@@@@Wxz *iii;;;;iii** #nMW@@@@@@@@@x *ii;;:::,,,..``                                    
149                               ```.:; zzzz# i:,.````  ``````````..,:;i ##zz# ;:..``                                               
135                              `*##zzzzzzzzzzznnxxMxxxxnnnnxxxxxxxxxMMxxxMMMMMMMMMMx#i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::,,...``      
134                             `* ####zzzz#zzzznnnxxxxxnnnnnnnxxxxxxxxxxxxxxxMxxxxxMMMx#i;;;;i;;i;i;;;;;;;;;;;;::::,,,..````        
132                            : # ####zzz#zzznzzzzzzzz#####zzznnnnnnnzzznnnnnnnxxxxxxxxxxxi`````````````````                        
145                            ``.,,,,:*xxMW@@@@#########niii*x@#######@@WMMW@@M ;;;;;;;;;;;;;;;;;;;;;;;;;;:,..`                     
133                            `i #####zzz##zznnnnnznzzzzzzzznnnnnnnnxxnnnnxxxxxxxxxxxxxMxi:::::::::::::::,,,,,....`````             
130                           :   ####################zzzzzzzzznnnnzznnnzzzznnnzznnnnnnnnnxxx,                                       
131                           `* # #######zzzzz####zz#####z##zzzzzzzzzzzzznznnnnnnnnnxnnnnxxi                                        
143                           `..,::;;;;in##############@*;;;; @#############@ni;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::,,.```            
128                          ,****            #######zzznnnnzzzzznnxxxnnnnnzznnnn#zxnzzznWWWWMi                                      
127                          ;i****      *  #z###zzzzz#zz##zzzzzzzzznnxnnnzzzznnxn#xnzznMWMxxxz`                                     
  

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

1. В настоящее время вы пытаетесь отсортировать разделы, а не строки. Создайте другой список, добавив a к нему внутри вашего for цикла, а затем отсортируйте этот второй список.

2. @CaffeinatedCod3r — Словари упорядочены в порядке вставки, так как же их сортировать?

3. @Sayse Спасибо, что указали. Не знал, что с 3.7 , dict сохраняет порядок вставки.

4. @fallenmcmullan Действительно ли источник данных содержит > символы и всегда ли элементы в скобках разбиты на несколько строк? sorted принимает ключ, который позволяет вам указать функцию, которая сообщает sorted, как сортировать данные, а не по умолчанию. Предоставьте более чистую версию исходных данных, и я мог бы помочь

5. list.append изменяет список и не генерирует и не возвращает новый список. Поэтому sortedList.append(a) добавляется к sortedList .

Ответ №1:

Я использовал регулярное выражение, чтобы найти число в начале каждой строки, и использую это как метод сортировки python

 import re

def sortByLeadingNumber(line):
    matches = re.match("^[d] ", line)[0]
    return int(matches)

with open('scrambled_file.txt') as file:
    sortedLines = list(sorted(file.readlines(),key=sortByLeadingNumber))

print(sortedLines)
  

Если вы не хотите использовать регулярные выражения, несколько менее надежным методом будет следующий, который просто разбивает строку на пробелы и использует первый элемент в качестве числа для сортировки по

 def sortByLeadingNumberNoRe(line):
    return int(line.split()[0])
  

Затем вы должны использовать это в качестве key аргумента sorted .

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

1. Что, если бы я не использовал «re»?

2. Я получаю сообщение об ошибке «объект’_io.TextIOWrapper’ не имеет атрибута ‘splitlines'»

3. @fallenmcmullan Никлас прав. Это должны быть строки чтения. Я изменил свой ответ. Я также добавлю метод без re

4. @NiklasMertsch Спасибо, что заметили это! Я переписывал свой ответ, чтобы обрабатывать чтение из файла, а не строки, как вы прокомментировали.

5. Вывод выглядит как ascii-изображение tellytubbies legs!