2016-09-14 9 views
0

Я начинающий Python и пытаюсь отправить процесс длинного txt-файла, который представляет собой список без разделителей, только пробелы. Я хочу сортировать его по первому столбцу.Сортировка входного файла в соответствии с первым столбцом, без разделителей, но пробелов

Код компилируется отлично, но он сортирует только мой выходной файл в соответствии с самым первым значением в первом столбце, но не в соответствии с самим номером. Я также безуспешно пробовал работу с устройством itemgetter.

Я пробовал это в течение нескольких часов и надеюсь, что кто-нибудь может мне помочь. Почему моя функция разделения строк не имеет эффекта, который я хочу?

f = open("traj_nvt_20000000.txt","r+") 
lines = f.readlines() for line in f.readlines(): 
line = line.strip() 
parts = line.split(" ") 
lines = sorted(lines, key=lambda line: line[0]) 
with open('test123.txt', 'w') as text: 
    text.writelines(lines) 

Отрывок из таблицы текстового файла, который я хочу разобраться:

54 2 -9.5377 -4.02842 -7.51558 7 
55 2 -9.6834 -4.88656 -7.29358 7 
459 2 -8.76522 -8.30942 -10.144 58 
50 1 -9.33774 -4.46175 -7.24097 7 
56 2 -8.84618 -4.59922 -7.44773 7 
462 2 -10.3377 -9.37008 -10.2265 58 
460 2 -8.59323 -8.64832 -9.32914 58 
457 1 -8.96511 -8.38283 -9.63619 58 
461 2 -9.0727 -7.89321 -9.40869 58 
369 1 -5.93643 -6.20083 -7.56102 47 
504 2 -7.94033 -2.66938 -10.3925 63 
371 2 -6.24752 -6.57434 -7.3023 47 

Помощь очень высоко ценится.

ответ

1

вы должны сортировать в цифровом виде, а не буквенно-цифровые, так преобразовать строку в целое или с плавающей точкой (я не все данные, я не уверен, если они все целые числа):

lines = sorted(lines, key=lambda line: float(line[0])) 

, но было бы еще лучше, чтобы отсортировать все значения, возвращая кортеж поплавков, так что если первые значения равны, остальные могут быть использованы для различения:

lines = sorted(lines, key=lambda line: [float(x) for x in line]) 

BTW ваш образец код неверен (есть смесь строк readlines & петель в начале, что не вызывает к). Вот небольшой тест, который работает:

f = open(r"U:\test.txt","r") # sample file in the question 
lines=[] 
for line in f: 
    lines.append(line.strip().split(" ")) 
f.close() 

lines.sort(key=lambda line: [float(x) for x in line]) 
for l in lines: 
    print(",".join(l)) 

результат:

50,1,-9.33774,-4.46175,-7.24097,7 
54,2,-9.5377,-4.02842,-7.51558,7 
55,2,-9.6834,-4.88656,-7.29358,7 
56,2,-8.84618,-4.59922,-7.44773,7 
369,1,-5.93643,-6.20083,-7.56102,47 
371,2,-6.24752,-6.57434,-7.3023,47 
457,1,-8.96511,-8.38283,-9.63619,58 
459,2,-8.76522,-8.30942,-10.144,58 
460,2,-8.59323,-8.64832,-9.32914,58 
461,2,-9.0727,-7.89321,-9.40869,58 
462,2,-10.3377,-9.37008,-10.2265,58 
504,2,-7.94033,-2.66938,-10.3925,63 
+0

Похоже, вы должны были бы разделить строку на '' 'строка [0]' '' для обозначения первой * колонки * а не первого персонажа. – wwii

+0

'line [0]' уже первый столбец (проверьте мой репродусор, код OP немного, скажем ... нечеткий. Вы получаете идею, но это не работает) –

+0

Я вижу, что ваше редактирование исправляет его, mea кульпа. – wwii