Как сгладить значение (список списков кортежей) ключа в словаре Python? - PullRequest
2 голосов
/ 10 марта 2020

У меня есть словарь в 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)]

Можно ли сгладить вывод или что-то изменить при создании словаря?

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

вы можете использовать рекурсивный подход с пониманием словаря:

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)]}
0 голосов
/ 10 марта 2020

Вы можете использовать рекурсию, а затем проверить, является ли экземпляр простым кортежем со значениями 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)]}

...