我是Python新手。我有一個包含3列的文本文件,第一列包含數字。我想按遞增順序對這個txt的行進行排序。我試過這個:根據Python中的第一列對文本文件進行排序
lines=[line for line in inputFile if line.strip()]
lines.sort()
但是,文件按非數字排序,但按字母順序排序。例如1,11,12,13,14,... 19,2,21 ....我怎樣才能解決這個問題?
謝謝。
我是Python新手。我有一個包含3列的文本文件,第一列包含數字。我想按遞增順序對這個txt的行進行排序。我試過這個:根據Python中的第一列對文本文件進行排序
lines=[line for line in inputFile if line.strip()]
lines.sort()
但是,文件按非數字排序,但按字母順序排序。例如1,11,12,13,14,... 19,2,21 ....我怎樣才能解決這個問題?
謝謝。
我不知道你所說的「列」(順便說一句,如果是什麼意思它是一個csv或tsv文件,檢查標準庫中的csv
模塊),但arknave的評論是正確的答案。甲簡單化,幼稚和脆實現(假設製表符分隔值):
def convert(line):
x, y, z = line.strip().split("\t")
if x.isdigit():
x = int(x)
return x, y, z
lines = sorted(convert(line) for line in infile if line.strip())
CAVEAT:這依賴於CPython的2.7的實現細節並作爲與另一種蟒版本或實施預期(AFAIK它可能無法工作將與CPython 3.x打破)。
更健壯的(但可能更慢)的解決方案:
def mycmp(t1, t2):
x, y = t1[0], t2[0]
x_int = x.isdigit()
y_int = y.isdigit()
if x_int and y_int:
x, y = map(int, (x, y))
if (x_int and y_int) or (not x_int and not y_int):
return cmp(x, y)
elif x_int:
# digits must come before non-digits
return -1
else:
# non-digits must come after digits
return 1
lines = sorted((line for line in infile if line.strip()), cmp=mycmp)
文件是一個.txt文件,每個文件中有3個條目行由製表符分隔。我想根據每行中的第一個條目對它進行排序。但是,它們並不全是int。第一列中還有2個字符X和Y.所以int(x)可能不起作用。 –
@BaturayKaya:參考更新的代碼片段 - 你只需要檢查第一個「列」是否可以轉換爲int - 但請注意警告。 –
增加了一個更強大的解決方案 –
它將值解釋爲字符串,所以19
確實是「小於」2
。您可以將它們轉換爲int
以通過數字值對它們進行正確排序。
lines=[map(int,line) for line in inputFile if line.strip()]
lines.sort()
或者,如果你不想修改值,並想離開他們作爲字符串:
lines.sort(key=lambda i : int(i))
我試過這個,但它給「int()與基數10無效的字面值:'' –
你有隻有像」1「,」2「的值,或者你有像」1.5「,3.2」等小數? – CoryKramer
我有整數1,2,3和兩個字符的X和Y.我想要的結果是:1 2 3 4 5 ...... XY –
人們還可以使用該密鑰參數排序功能:
def get_key(a):
return [int(x) if x.isdigit() else x for x in a.split('\t')]
lines = sorted((line for line in infile if line.strip()), key=get_key)
編輯:要解決的實現細節在字符串之前對整數進行排序,可以使用以下按鍵功能(但這會導致字符保持未排序狀態):
def get_key(a):
return [int(x) if x.isdigit() else float('inf') for x in a.split('\t')]
lines = sorted((line for line in infile if line.strip()), key=get_key)
請參考我自己的答案中的警告:這依賴於在字符串之前實現排序。 –
我想,我添加了一個修改來解決這個問題。 –
是否有任何東西阻止您將每行轉換爲(數字,字符串,字符串)的元組,然後對該列表進行排序? – arknave
我忘了提及:第一列中還有X和Y值,所以我不能將它們看作數字,字符串,字符串。 –
請提供一些示例輸入,以便我們確切知道您在說什麼。 – jwd