按元素值将列表分成多个列表

8
我有以下列表:
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'的值相同,因此它们将保持在同一组中;'B'和'D'的值也相同,因此它们将共享同一组,然后'D'将形成自己的一组。

如何实现这个结果?


初始列表可能是错误的,因为它是一个嵌套列表。 - Ali Afshar
我只想根据字典中的相同值将第一个列表分成组。 - Meryem
5个回答

5
你需要使用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']]

3

最简单的方法是使用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']]

3

我不确定这是否符合您的要求,但您可以根据 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']]

2
我们可以使用您的字典映射对列表进行排序,然后使用 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']]

2

试试这个:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接