繁体   English   中英

根据元素值将列表分为多个列表

[英]Divide list to multiple lists based on elements value

我有以下列表:

initial_list = [['B', 'D', 'A', 'C', 'E']]

在列表的每个元素上,我应用一个函数并将结果放在字典中:

for state in initial_list:
    next_dict[state] = move([state], alphabet)

这给出了以下结果:

next_dict = {'D': ['E'], 'B': ['D'], 'A': ['C'], 'C': ['C'], 'E': ['D']}

我想要做的是根据next_dict字典中的值将键与initial_list分开,基本上将第一个列表的元素分组到next_dict中具有相同值的元素:

new_list = [['A', 'C'], ['B', 'E'], ['D']]

'A'和'C'将保持在同一组中,因为它们具有相同的值'C','B'和'D'也将共享同一组,因为它们的值为'D'然后'D'将是在它自己的小组。

我怎样才能达到这个效果?

在通过next_dict值对列表进行排序后,您需要groupby

每次键函数的值发生变化时,它都会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序)。

from itertools import groupby

initial_list = ['B', 'D', 'A', 'C', 'E']

def move(letter):
    return {'A': 'C', 'C': 'C', 'D': 'E', 'E': 'D', 'B': 'D'}.get(letter)
sorted_list = sorted(initial_list, key=move)
print [list(v) for k,v in groupby(sorted_list, key=move)]
#=> [['A', 'C'], ['B', 'E'], ['D']]

实现这一目标的最简单方法是使用带有键的itertools.groupby作为dict.get

>>> from itertools import groupby
>>> next_dict = {'D': ['E'], 'B': ['D'], 'A': ['C'], 'C': ['C'], 'E': ['D']}
>>> initial_list = ['B', 'D', 'A', 'C', 'E']

>>> [list(i) for _, i in groupby(sorted(initial_list, key=next_dict.get), next_dict.get)]
[['A', 'C'], ['B', 'E'], ['D']]

我不确定这是你想要的,但你可以根据它们在next_dict的值对值进行next_dict

>>> next_dict = {'D': 'E', 'B': 'D', 'A': 'C', 'C': 'C', 'E': 'D'}

>>> # external library but one can also use a defaultdict.
>>> from iteration_utilities import groupedby  

>>> groupings = groupedby(['B', 'D', 'A', 'C', 'E'], key=next_dict.__getitem__)
>>> groupings
{'C': ['A', 'C'], 'D': ['B', 'E'], 'E': ['D']}

然后将其转换为其值列表:

>>> list(groupings.values())
[['A', 'C'], ['D'], ['B', 'E']]

将所有内容组合成一个单行(不是真的推荐,但很多人更喜欢):

>>> list(groupedby(['B', 'D', 'A', 'C', 'E'], key=next_dict.__getitem__).values())
[['A', 'C'], ['D'], ['B', 'E']]

我们可以使用字典映射对列表进行排序,然后使用itertools.groupby组。 我在这里做的唯一修改就是让你的初始列表成为一个实际的平面列表。

>>> from itertools import groupby
>>> initial_list = ['B', 'D', 'A', 'C', 'E']
>>> next_dict = {'D': ['E'], 'B': ['D'], 'A': ['C'], 'C': ['C'], 'E': ['D']}
>>> s_key = lambda x: next_dict[x]
>>> [list(v) for k, v in groupby(sorted(initial_list, key=s_key), key=s_key)]
[['A', 'C'], ['B', 'E'], ['D']]

尝试这个:

next_next_dict = {}
for key in next_dict:
    if next_dict[key][0] in next_next_dict:
        next_next_dict[next_dict[key][0]] += key
    else:
        next_next_dict[next_dict[key][0]] = [key]
new_list = next_next_dict.values()

或这个:

new_list = []
for value in next_dict.values():
    new_value = [key for key in next_dict.keys() if next_dict[key] == value]
    if new_value not in new_list:
        new_list.append(new_value)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM