我想过滤包含相同最后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 :(得分: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
答案 2 :(得分:1)
itertools
很棒。使用groupby
和lambda
将列表分组到相同的结尾,然后从那里很容易:
>>> 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 :(得分: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