#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!