2014-07-17 42 views
0

我是Python新手。我有一個包含3列的文本文件,第一列包含數字。我想按遞增順序對這個txt的行進行排序。我試過這個:根據Python中的第一列對文本文件進行排序

lines=[line for line in inputFile if line.strip()] 
lines.sort() 

但是,文件按非數字排序,但按字母順序排序。例如1,11,12,13,14,... 19,2,21 ....我怎樣才能解決這個問題?

謝謝。

+3

是否有任何東西阻止您將每行轉換爲(數字,字符串,字符串)的元組,然後對該列表進行排序? – arknave

+0

我忘了提及:第一列中還有X和Y值,所以我不能將它們看作數字,字符串,字符串。 –

+0

請提供一些示例輸入,以便我們確切知道您在說什麼。 – jwd

回答

1

我不知道你所說的「列」(順便說一句,如果是什麼意思它是一個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) 
+0

文件是一個.txt文件,每個文件中有3個條目行由製表符分隔。我想根據每行中的第一個條目對它進行排序。但是,它們並不全是int。第一列中還有2個字符X和Y.所以int(x)可能不起作用。 –

+0

@BaturayKaya:參考更新的代碼片段 - 你只需要檢查第一個「列」是否可以轉換爲int - 但請注意警告。 –

+0

增加了一個更強大的解決方案 –

0

它將值解釋爲字符串,所以19確實是「小於」2。您可以將它們轉換爲int以通過數字值對它們進行正確排序。

lines=[map(int,line) for line in inputFile if line.strip()] 
lines.sort() 

或者,如果你不想修改值,並想離開他們作爲字符串:

lines.sort(key=lambda i : int(i)) 
+0

我試過這個,但它給「int()與基數10無效的字面值:'' –

+0

你有隻有像」1「,」2「的值,或者你有像」1.5「,3.2」等小數? – CoryKramer

+0

我有整數1,2,3和兩個字符的X和Y.我想要的結果是:1 2 3 4 5 ...... XY –

0

人們還可以使用該密鑰參數排序功能:

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) 
+0

請參考我自己的答案中的警告:這依賴於在字符串之前實現排序。 –

+0

我想,我添加了一個修改來解決這個問題。 –

相關問題