如何展平Python字典中键的值(元组列表列表)?

Posted

技术标签:

【中文标题】如何展平Python字典中键的值(元组列表列表)?【英文标题】:How to flatten the value (list of lists of tuples) of a key in Python dictionary? 【发布时间】:2020-06-22 13:09:25 【问题描述】:

我在 python 中有一个字典,看起来像这样:

   (-1, 1): (0, 1),
   (0, 0): [([([(1, 0), (0, 1)], (0, 1))], (1, 0))],
   (0, 1): [([([((-1, 1), (0, 2))], (1, 1))], (0, 0))],
   (0, 2): (0, 1) 

我不希望它有所有这些额外的括号和括号。 这是我用来创建这个字典的代码:

      if condition1==True:
        if condition2==True:

           if (x,y) in adjList_dict:  ##if the (x,y) tuple key is already in the dict

               ##add tuple neighbours[i] to existing list of tuples 
               adjList_dict[(x,y)]=[(adjList_dict[(x,y)],neighbours[i])] 

                    else:
                        adjList_dict.update( (x,y) : neighbours[i] )

我只是想创建一个字典,其中键是元组,每个键的值是元组列表。

例如我想要这个结果:(0, 0): [(1, 0), (0, 1), (0, 1), (1, 0)]

我可以展平输出还是应该在创建字典时更改某些内容?

【问题讨论】:

【参考方案1】:

您可以使用递归,然后测试实例是否是一个简单的元组,其中包含 int 值,例如:

sample = (-1, 1): (0, 1),
   (0, 0): [([([(1, 0), (0, 1)], (0, 1))], (1, 0))],
   (0, 1): [([([((-1, 1), (0, 2))], (1, 1))], (0, 0))],
   (0, 2): (0, 1)


def flatten(data, output):
    if isinstance(data, tuple) and isinstance(data[0], int):
        output.append(data)
    else:
        for e in data:
            flatten(e, output)


output = 
for key, values in sample.items():
    flatten_values = []
    flatten(values, flatten_values)
    output[key] = flatten_values

print(output)
>>> (-1, 1): [(0, 1)], (0, 0): [(1, 0), (0, 1), (0, 1), (1, 0)], (0, 1): [(-1, 1), (0, 2), (1, 1), (0, 0)], (0, 2): [(0, 1)]

【讨论】:

【参考方案2】:

您可以使用具有字典理解的递归方法:

d = (-1, 1): (0, 1),
   (0, 0): [([([(1, 0), (0, 1)], (0, 1))], (1, 0))],
   (0, 1): [([([((-1, 1), (0, 2))], (1, 1))], (0, 0))],
   (0, 2): (0, 1)



def flatten(e):
    if isinstance(e[0], int):
        yield e
    else:    
        for i in e:
            yield from flatten(i)

k: list(flatten(v)) for k, v in d.items()

输出:

(-1, 1): [(0, 1)],
 (0, 0): [(1, 0), (0, 1), (0, 1), (1, 0)],
 (0, 1): [(-1, 1), (0, 2), (1, 1), (0, 0)],
 (0, 2): [(0, 1)]

【讨论】:

以上是关于如何展平Python字典中键的值(元组列表列表)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中更改嵌套字典中键的值[关闭]

将嵌套命名元组的列表展平为字典列表

第7章

如何更新嵌套字典中键的值?

Python 字典方法

Python 字典方法