Как преобразовать двухэлементный список в словарь (один элемент будет ключевым, а другой будет значением), если присутствуют дубликаты? - PullRequest
1 голос
/ 23 октября 2019

Итак, у меня есть список списков следующим образом.

ab_list = [['AB','35'],['AB','78'],['CD','98'],['CD','41'],['CD','67'].....]

Теперь я хочу преобразовать этот список в словарь так, чтобы он имел следующую форму:

ab_dict = {'AB':'35|78','CD':'98|41|67'.........}

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

for val in ab_list:
for value in final_list:
if val[0] == value[0]:
value[1] = value[1] + "|" + val[1]

Но это не работает должным образом. Как это сделать?

Ответы [ 4 ]

6 голосов
/ 23 октября 2019

Это один подход с использованием setdefault и простой итерацией.

Пример:

ab_list = [['AB','35'],['AB','78'],['CD','98'],['CD','41'],['CD','67']]
result = {}
for k, v in ab_list:
    result.setdefault(k, []).append(v)

ab_dict = {k: "|".join(v) for k, v in result.items()}
print(ab_dict)

Выход:

{'AB': '35|78', 'CD': '98|41|67'}
3 голосов
/ 23 октября 2019
ab_list = [['AB', '35'], ['AB', '78'], ['CD', '98'], ['CD', '41'], ['CD', '67']]
ab_dict = {}

for k, v in ab_list:
    if k in ab_dict:
        ab_dict[k] += '|' + v
    else:
        ab_dict[k] = v

print(ab_dict)

Выход:

{'AB': '35|78', 'CD': '98|41|67'}
1 голос
/ 23 октября 2019

Попробуйте это:

# Stage-1
#
lst = [['AB', '35'], ['AB', '78'], ['CD', '98']]
tmp = []

for i in lst:
    tmp.append(i[0])

tmp = list(set(tmp))

# Stage-2
#
dct = {}

for i in tmp:
    dct.update({i: []})

for i in lst:
    dct[i[0]].append(i[1])

# Stage-3
#
final = {}

for i, j in dct.items():
    string = ''

    if len(j) == 1:
        string = j[0]
    else:
        for k in j:
            string += k + ' | '

        string = string[:-3]

    final.update({i: string})

Результат:

{'AB': '35 | 78', 'CD': '98'}
1 голос
/ 23 октября 2019

РЕДАКТИРОВАТЬ: Решение ниже работает только в том случае, если все пары с одинаковым первым элементом являются последовательными, что имеет место в примере, но может не быть в общем (в противном случае вам нужно сначала отсортировать список, чтобы он работал, чтобыло бы не очень хорошим решением).

Это один из способов сделать это с groupby:

from itertools import groupby

ab_list = [['AB', '35'], ['AB', '78'], ['CD', '98'], ['CD', '41'], ['CD', '67']]
ab_dict = {k: '|'.join(it[1] for it in v) for k, v in groupby(ab_list, lambda it: it[0])}
print(ab_dict)
# {'AB': '35|78', 'CD': '98|41|67'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...