给出列表字典,
key_to_list = {
'one': [1, 3, 5, 7],
'two': [2, 4, 6, 8],
'three': [1, 2, 5, 6],
'four': [2, 5, 7, 8]
}
创建从列表元素到其键的映射的最佳方法是什么?
list_element_to_keys = {
1: {'one', 'three'},
2: {'two', 'three', 'four'},
3: {'one'},
4: {'two'},
5: {'one', 'three', 'four'},
6: {'two', 'three'},
7: {'one', 'four'},
8: {'two', 'four'}
}
from collections import defaultdict
list_element_to_keys = defaultdict(set)
for key, value in key_to_list.items():
for item in value:
list_element_to_keys[item].add(key)
我的一位朋友建议可以使用 字典理解,但我一直在遇到问题 因为多个键的列表包含一些相同的项目。
我也认为他们可能会有一些itertools
魔法可以提供帮助,
但我不是肯定的。
我在朋友的帮助下找到了有效的词典理解。
from itertools import chain
list_element_to_keys= { i: set(k for k,v in key_to_list.items() if i in v) for i in set(chain.from_iterable(key_to_list.values())) }
答案 0 :(得分:1)
你也可以这样做
dialogBuilder.setPositiveButton("Edit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// you have your edit button
}
});
dialogBuilder.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// you have your delete button
}
});
这导致
d = {}; [d.setdefault(i,[]).append(k) for k,v in key_to_list.items() for i in v]
print d
答案 1 :(得分:0)
您的解决方案很好,它可以正常工作,defaultdict
是解决此类问题的明显(好)选择。
您可以改进的一件事是使用six.iteritems(key_to_list)
,这将使Python2上的速度更快。
答案 2 :(得分:0)
我在一个声明的嵌套理解中得到了它:
代码:
list_element_to_keys = \
{new_key : [old_key for old_key in key_to_list.keys() if new_key in key_to_list[old_key]] \
for new_key in set([item for value_list in key_to_list.values() for item in value_list ])}
print (list_element_to_keys)
输出(添加换行以帮助阅读):
{1: ['one', 'three'], 2: ['two', 'four', 'three'],
3: ['one'], 4: ['two'],
5: ['four', 'one', 'three'], 6: ['two', 'three'],
7: ['four', 'one'], 8: ['two', 'four']}