Преобразование двух списков с дублирующимися значениями ключей в словарь - PullRequest
0 голосов
/ 05 ноября 2018
list1 = ['10/20/2008', '3/25/2009', '3/26/2009', '3/28/2009', '3/28/2009', '8/23/2009', '8/23/2009']
list2 = [0,0,0,0,1,0,0]

Я хочу, чтобы мой вывод выглядел так:

{'10/20/2008': 0, '3/25/2009':0, '3/26/2009': 0, '3/28/2009': [0,1], '8/23/2009': [0,0]}

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Вы можете использовать встроенный в Python groupby.

from itertools import groupby

list1 = ['10/20/2008', '3/25/2009', '3/26/2009', '3/28/2009', '3/28/2009', '8/23/2009', '8/23/2009']
list2 = [0, 0, 0, 0, 1, 0, 0]

# Zip and sort the list in order to use them with groupby
list3 = [(x, y) for x, y in zip(list1, list2)]
list3.sort()

result = {}

# Group by date.
for value, grouper in groupby(list3, lambda x: x[0]):
    # key_value has the form (date, zero_or_one)
    key_value = grouper.next()
    # Populate result according requirements. 
    result[value] = key_value[1]
    # If more than one value for date, use a list.
    for index, kv in enumerate(grouper):
        if index == 0:
            result[value] = [result[value], kv[1]]
        else:
            result[value].append(value)

print result

Результат:

{'8/23/2009': [0, 0], '3/26/2009': 0, '3/28/2009': [0, 1], '3/25/2009': 0, '10/20/2008': 0}
0 голосов
/ 05 ноября 2018

Один из подходов заключается в использовании defaultdict следующим образом:

from collections import defaultdict
res_dict = defaultdict(list)

for k, v in zip(list1, list2):
    res_dict[k].append(v)
0 голосов
/ 05 ноября 2018

Это не совсем реализация только для списка, но она должна работать.

import numpy as np
listToDict=dict()
npList1=np.array(list1)
npList2=np.array(list2)
for date in set(list1):
    listToDict[date]=list(npList2[[np.where(npList1 == date)[0]]])
0 голосов
/ 05 ноября 2018

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

list1 = ['10/20/2008', '3/25/2009', '3/26/2009', '3/28/2009', '3/28/2009', '8/23/2009', '8/23/2009']
list2 = [0, 0, 0, 0, 1, 0, 0]

result = {}
for k, v in zip(list1, list2):
    result.setdefault(k, []).append(v)

print(result)

выход

{'3/28/2009': [0, 1], '3/26/2009': [0], '10/20/2008': [0], '3/25/2009': [0], '8/23/2009': [0, 0]}

Если вы хотите, чтобы список одного элемента был просто единственным элементом, сделайте следующее:

result = {k: v[0] if len(v) == 1 else v for k, v in result.items()}

выход

{'3/25/2009': 0, '3/26/2009': 0, '8/23/2009': [0, 0], '10/20/2008': 0, '3/28/2009': [0, 1]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...