给出一本字典:
d = {'one two':2, 'three four':4, 'one three':0}
我想拆分键并创建一个列表或集:
s = ('one','two','three','four')
我试过了:
s = set(kk for kk in k.split() for k in d.keys())
但这会产生:
('four','three')
如何获得所有密钥?
答案 0 :(得分:4)
您可以使用列表推导来获取拆分后的所有值:
,而不是设置s = [kk for k in d.keys() for kk in k.split()]
# ['three', 'four', 'one', 'two', 'one', 'three']
或者要获取唯一值,请将其设置为:
s = set([kk for k in d.keys() for kk in k.split()])
# {'four', 'one', 'three', 'two'}
答案 1 :(得分:2)
使用空格加入字典中的所有键,将结果字符串拆分为可能包含重复项的列表,然后从该列表中创建一个集合:
set(' '.join(d.keys()).split())
修改强> 关于复杂性的以下主张是错误的。两者都是O(n),列表推导效率稍高,因为没有构造中间数据结构。我在这里留下了错误的主张,因为评论中有很好的解释。
此方法为O(n)。你的方法和其他答案中的方法是O(n ^ 2)。
>>> d = {'one two':2, 'three four':4, 'one three':0}
>>> set(' '.join(d.keys()).split())
set(['four', 'three', 'two', 'one'])
答案 2 :(得分:0)
这是在python 3.x中使用functools.reduce的另一种方法
import functools
d = {'one two':2, 'three four':4, 'one three':0}
functools.reduce(or_,[set(k.split()) for k in d.keys()])
输出
{'four', 'one', 'three', 'two'}
对于元组结果,您可以执行以下操作:
tuple(functools.reduce(or_,[set(k.split()) for k in d.keys()]))
输出
('四','一','三','二')
与之前的答案不同,最后一次编辑添加对元组的调用会返回一个请求而不是一个集合的元组。与提供的其他解决方案一样,它遍历字典键,将键分成元素,最后将元素缩减为一组。与其他解决方案相同的复杂程度。