从 python 中的集合中检索所有最小的字符串

retrieve all the smallest strings from a set in python

我有一套看起来像

set(['A', 'BF', 'B', 'BA', 'ABF', 'AF', 'F', 'BFA', 'AFB', 'BAF', 'FA', 'FB', 'AB', 'FAB', 'FBA'])

我正在尝试将所有长度最小的字符串放入列表中 我尝试使用

print min((element for element in getParts(working_scheme,k)), key=len)

只打印 A 但我需要 ['A', 'B', 'F']

我怎样才能完成这个?

min() 只会检索 一个 结果。

如果您想检索 所有 个最短的结果,您必须自己编写代码:

shortest = []
shortest_length = float('inf')
for element in getParts(working_scheme, k):
    if len(element) < shortest_length:
        shortest = [element]
        shortest_length = len(element)
    elif len(element) == shortest_length:
        shortest.append(element)

这只在集合上循环一次。

类似

>>> a_set = set(['A', 'BF', 'B', 'BA', 'ABF', 'AF', 'F', 'BFA', 'AFB', 'BAF', 'FA', 'FB', 'AB', 'FAB', 'FBA'])
>>> min_len = min( len(x) for x in a_set  )
>>> [ x for x in a_set if len(x) == min_len ]
['A', 'B', 'F']

拆分

  • min_len = min( [ len(x) for x in a_set ] ) returns 长度的最小值。

  • [ x for x in a_set if len(x) == min_len ] List comprehension, returns 长度等于 min_len

  • 的元素列表
data = set(['A', 'BF', 'B', 'BA', 'ABF', 'AF', 'F', 'BFA', 'AFB', 'BAF', 'FA', 'FB', 'AB', 'FAB', 'FBA'])

_len = len(sorted(data, key=len)[0])
print filter(lambda x:len(x)==_len, data)

Returns:

['A', 'B', 'F']

另一种使用字典的方法:

from collections import defaultdict

items = set(['A', 'BF', 'B', 'BA', 'ABF', 'AF', 'F', 'BFA', 'AFB', 'BAF', 'FA', 'FB', 'AB', 'FAB', 'FBA'])
d = defaultdict(list)
for item in items:
    d[len(item)].append(item)
results = d[min(d)]

结果: ['A'、'B'、'F']