2014-04-05 100 views
1

我想過濾包含相同最後4位數的所有項目的列表,我想打印它們中最長的一個。按包含字符串的最長元素過濾列表

例如:

lst = ['abcd1234','abcdabcd1234','gqweri7890','poiupoiupoiupoiu7890'] 
# want to return abcdabcd1234 and poiupoiupoiupoiu7890 

在這種情況下,我們打印包含1234的元件的時間越長,和含7890查找包含特定元素的最長元素中的元素的較長不硬,但對列表中的所有項目(不同的最後四位數字)進行有效似乎很困難。

我的嘗試是使用列表中理解和切片首先找出所有不同的最後4位數字:

ids=[] 
for x in lst: 
    ids.append(x[-4:]) 
ids = list(set(ids)) 

接下來,我將通過列表中的索引搜索,以「MAX_LENGTH」變量和「current_id」找到每個ID的最大元素。這顯然效率很低,不知道做這件事的最好方法是什麼。

+0

對不起,我會後的代碼。 –

回答

2

使用字典:

>>> lst = ['abcd1234','abcdabcd1234','gqweri7890','poiupoiupoiupoiu7890'] 
>>> d = {} # to keep the longest items for digits. 
>>> for item in lst: 
...  key = item[-4:] # last 4 characters 
...  d[key] = max(d.get(key, ''), item, key=len) 
... 
>>> d.values() # list(d.values()) in Python 3.x 
['abcdabcd1234', 'poiupoiupoiupoiu7890'] 
1
from collections import defaultdict 
d = defaultdict(str) 
lst = ['abcd1234','abcdabcd1234','gqweri7890','poiupoiupoiupoiu7890'] 
for x in lst: 
    if len(x) > len(d[x[-4:]]): 
     d[x[-4:]] = x 

要顯示的結果:

for key, value in d.items(): 
    print key,'=', value 

其產生:

1234 = abcdabcd1234 
7890 = poiupoiupoiupoiu7890 
0

稍微更通用

import string 
import collections 
lst = ['abcd1234','abcdabcd1234','gqweri7890','poiupoiupoiupoiu7890'] 
z = [(x.translate(None, x.translate(None, string.digits)), x) for x in lst] 
x = collections.defaultdict(list) 
for a, b in z: 
    x[a].append(b) 

for k in x: 
    print k, max(x[k], key=len) 
1234 abcdabcd1234                
7890 poiupoiupoiupoiu7890  
1

itertools很好。使用groupbylambda到組列表到相同的結局,然後從那裏很容易:

>>> from itertools import groupby 
>>> lst = ['abcd1234','abcdabcd1234','gqweri7890','poiupoiupoiupoiu7890'] 
>>> [max(y, key=len) for x, y in groupby(lst, lambda l: l[-4:])] 
['abcdabcd1234', 'poiupoiupoiupoiu7890'] 
+3

這假設所有以ie 7890結尾的元素都在一個連續的塊中一起出現。 –

+0

@HughBothwell好吧,他們在OP的例子中。因此,假設他們會是公平的。 –

+3

(聳肩)他們可能會這樣做;一般我不會期望它。 –