gpt4 book ai didi

python - 根据任意标准嵌套平面列表

转载 作者:太空狗 更新时间:2023-10-29 17:47:41 25 4
gpt4 key购买 nike

我有一个唯一对象的平面列表,其中一些可能与其他对象共享给定属性。我希望创建一个嵌套的列表列表,其中的对象按给定属性分组。作为一个最小的例子,给定以下列表:

>>> flat = ["Shoes", "pants", "shirt", "tie", "jacket", "hat"]

我可能想按长度分组,例如:

>>> nest_by_length(flat)
[['tie', 'hat'], ['shoes', 'pants', 'shirt'], ['jacket']]

我见过几个 similar questionssuggestions .然而,在所有这些情况下,嵌套都是基于输入列表的顺序。在我的例子中,输入列表的顺序是完全不可预测的,输出的子列表数量和每个子列表的项目数量也是如此。

是否有标准函数或惯用方法来完成此操作?

最佳答案

现有列表的常用习惯是使用 groupby在 itertools 中:

from itertools import groupby

flat = ["Shoes", "pants", "shirt", "tie", "jacket", "hat"]

result=[]
for k, g in groupby(sorted(flat, key=len), key=len):
result.append(list(g))

print result

或者,更简洁地说:

[list(g) for _,g in groupby(sorted(flat, key=len), key=len)]

打印:

[['tie', 'hat'], ['Shoes', 'pants', 'shirt'], ['jacket']]

groupby 的输入根据键函数输出的变化值分组,在本例中为 len。一般情况下,需要根据相同的键函数对列表进行预排序,所以会先调用sorted函数。

如果您的源列表还不完整,或者无法根据条件进行排序(或者您只是更喜欢其他选项),请创建一个将您的条件映射到唯一键值的字典:

groups={}
for e in flat:
groups.setdefault(len(e), []).append(e)

print groups
# {5: ['Shoes', 'pants', 'shirt'], 3: ['tie', 'hat'], 6: ['jacket']}

您还可以使用 defaultdict而不是使用任意键值设置默认值:

from collections import defaultdict
groups=defaultdict(list)
for e in flat:
groups[len(e)].append(e)
# groups=defaultdict(<type 'list'>, {5: ['Shoes', 'pants', 'shirt'], 3: ['tie', 'hat'], 6: ['jacket']})

无论哪种情况,您都可以从中创建嵌套列表:

>>> [groups[k] for k in sorted(groups.keys())] 
[['tie', 'hat'], ['Shoes', 'pants', 'shirt'], ['jacket']]

关于python - 根据任意标准嵌套平面列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30198235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com