按包含字符串的最长元素筛选列表

时间:2014-04-05 20:30:03

标签: python sorting lambda list-comprehension

我想过滤包含相同最后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的最大元素。这显然是非常低效的,并且想知道最好的方法是什么。

4 个答案:

答案 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很棒。使用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 :(得分: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