展开python字典以表达共享列表值

时间:2018-09-03 12:49:30

标签: python dictionary

假设我在Python3.x中有以下简单字典:

example = {1:[4, 5, 6], 2:[7, 8, 9]}

我想要一种扩展字典的方法,如下所示:

expanded_example = {1:[4, 5, 6], 2:[7, 8, 9], 4:[5, 6], 5:[4, 6], 6:[4, 5], 7:[8, 9], 8:[7, 9], 9:[7, 8]}

由于多个键共享的值,这变得非常复杂。例如,

example2 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}

此处4是与1和2相关联的列表中的值。

如果存在“重复”值元素,则有两种方法:

(1)仅保留与某个键立即相关的值:

{1:[4, 5, 6], 2:[4, 7, 8, 9], 4:[5, 6], 5:[4, 6], 6:[4, 5], 7:[8, 9], 8:[7, 9], 9:[7, 8]}

(2)保留所有关联的值(因为键“ 1”和“ 2”之间共享“ 4”):

{1:[4, 5, 6], 2:[4, 7, 8, 9], 4:[5, 6, 7, 8, 9], 5:[4, 6], 6:[4, 5], 7:[4, 8, 9], 8:[4, 7, 9], 9:[4, 7, 8]}

已编辑:

我对这项任务的想法是使用collections.defaultdict

from collections import defaultdict
dict1 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}
d_dict = defaultdict(list)

for k,l in dict1.items():
    for v in l:
        d_dict[v].append(l)

print(d_dict)
## defaultdict(<class 'list'>, {4: [[4, 5, 6], [4, 7, 8, 9]], 5: [[4, 5, 6]], 6: [[4, 5, 6]], 7: [[4, 7, 8, 9]], 8: [[4, 7, 8, 9]], 9: [[4, 7, 8, 9]]})

这为我提供了一些帮助,但是列表列表中有重复元素...

2 个答案:

答案 0 :(得分:2)

注意::此答案仅涉及方法1。

您可以使用数据的副本,因为在迭代视图时不应添加/删除字典项:

d = {1:[4, 5, 6], 2:[7, 8, 9]}

for k, v in list(d.items()):
    for w in v:
        L = v.copy()
        d[L.pop(L.index(w))] = L

print(d)

{1: [4, 5, 6], 2: [7, 8, 9], 4: [5, 6], 5: [4, 6],
 6: [4, 5], 7: [8, 9], 8: [7, 9], 9: [7, 8]}

答案 1 :(得分:2)

策略2

SimpleDateFormat format = new SimpleDateFormat("hh:mm");
Date date1 = format.parse(timestart);
Date date2 = format.parse(timeend);
Date date3 = format.parse(breaktime);
long mills = date2.getTime() - date1.getTime() - date3.getTime();
int hours = (int)(mills/(1000 * 60 * 60));
int mins = (int) mills/(1000*60) %60;

策略1

example2 = {1:[4, 5, 6], 2:[4, 7, 8, 9]}
output = {**example2}

for val in example2.values():
    for idx,v in enumerate(val):
        if v not in output:
            output[v] = val[0:idx]+val[idx+1:]
        else:
            output[v].extend(val[0:idx]+val[idx+1:])

print(output)
#{1: [4, 5, 6], 2: [4, 7, 8, 9], 4: [5, 6, 7, 8, 9], 5: [4, 6], 6: [4, 5], 7: [4, 8, 9], 8: [4, 7, 9], 9: [4, 7, 8]}
相关问题