Получение индексов каждого элемента в списке списков и создание словаря - PullRequest
5 голосов
/ 10 марта 2020

Я пытаюсь создать словарь, в котором ключи являются элементами каждого списка, а значения являются их индексами в этом списке списков, чтобы я мог легко найти, где именно находится каждый элемент.

Итак если список [['a', 'a', 'b'], ['a', 'b', 'b'], ['c', 'c', 'c']],

словарь должен выглядеть следующим образом: {'c': {(2, 0), (2, 1), (2, 2)}, 'b': {(1, 1), (1, 2), (0, 2)}, 'a': {(0, 1), (1, 0), (0, 0)}}

Я могу получить индекс каждого элемента в соответствующих списках с пониманием списка: final_list = [list(enumerate(i)) for i in mylist] но я не смог ' t найти способ получить их «полные» индексы, которые также включают индекс их списка.

Ответы [ 4 ]

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

Вот простое решение:

input = [['a', 'a', 'b'], ['a', 'b', 'b'], ['c', 'c', 'c']]

result = {}
for i, lst in enumerate(input):
    for j, element in enumerate(lst):
        if element in result:
            result[element].add((i, j))
        else:
            result[element] = {(i, j)}
3 голосов
/ 10 марта 2020

вы можете использовать:

l = [['a', 'a', 'b'], ['a', 'b', 'b'], ['c', 'c', 'c']]

result = {}
for i, e in enumerate(l):
    for j, x in enumerate(e):
        result.setdefault(x, set()).add((i, j))
print(result)

вывод:

{'a': {(0, 0), (0, 1), (1, 0)},
 'b': {(0, 2), (1, 1), (1, 2)},
 'c': {(2, 0), (2, 1), (2, 2)}}
2 голосов
/ 10 марта 2020

Хотя было бы очень неэффективно писать однострочник, вы можете использовать collections.defaultdict для упрощения вещей. На самом деле лучше использовать dict.setdefault, потому что он не создает пустой контейнер каждый раз, когда вы хотите добавить значение, даже когда ключ уже присутствует:

result = defaultdict(list)
for i, row in enumerate(mylist):
     for j, key in enumerate(row):
         result[key].append((i, j))

Однострочное решение должно сделать несколько проходов через mylist, чтобы накопить все значения для данного ключа. Это было бы излишне сложно и выполнялось бы с O (n ^ 2) временной сложностью.

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

Вы можете сделать это так:

res = {}
for i, l in enumerate(var):
    for j, letter in enumerate(l):
        res[letter] = res.get(letter, set()) | {(i, j)}

res

# {'a': {(0, 0), (0, 1), (1, 0)},
#  'b': {(0, 2), (1, 1), (1, 2)},
#  'c': {(2, 0), (2, 1), (2, 2)}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...