我有以下字典:
a = dict()
a["A"] = [1,2,3,4,5]
a["B"] = [1,2]
我想在字典中遍历每个值(在这种情况下以列表的形式),如果列表中的元素数量大于2,我想删除第二个元素之后的所有元素。
例如,在我更改值后,我的字典应为:
a["A"] = [1,2] # [3,4,5] are removed from this value
a["B"] = [1,2]
我试过了:
del a["A"][3:len(a[2])]
但是这又回来了:
[3, 4, [1, 2, 3]]
两个问题: 1)为什么我的尝试输出是这样的? 2)我如何正确实现我想要做的事情?
谢谢!
答案 0 :(得分:2)
实现你想要的最简单的方法是“按字面意思写”:
for value in dictionary.values():
del value[2:]
可以理解为:
对于字典中的每个值,删除之后的所有元素 第二
请注意:
在某些情况下,您可能想要创建一个新字典和/或避免改变字典的值,在这种情况下,您应该避免使用del
,而是重新分配切片值:
dictionary[key] = value[:2]
它似乎也是效率最高的:
In [1]: %%timeit
...: a = {'A': [1,2,3,4,5], 'B': [1,2]}
...: for value in a.values():
...: del value[2:]
...:
1000000 loops, best of 3: 663 ns per loop
In [2]: %%timeit
...: a = {'A': [1,2,3,4,5], 'B': [1,2]}
...: for key, value in a.items():
...: a[key] = value[:2]
...:
1000000 loops, best of 3: 920 ns per loop
In [3]: %%timeit
...: a = {'A': [1,2,3,4,5], 'B': [1,2]}
...: for value in a.values():
...: if len(value) > 2:
...: del value[2:]
...:
1000000 loops, best of 3: 796 ns per loop
In [4]: %%timeit
...: a = {'A': [1,2,3,4,5], 'B': [1,2]}
...: a = {k:v[:2] for k,v in a.items()}
...:
1000000 loops, best of 3: 1.15 us per loop
如果大多数值的长度为2或更短,则仅在必要时向切片添加if len(value) > 2:
可能会使性能轻微增加。
如果您希望大多数值超过2,则只会增加开销。
关于你的第一个问题:
执行del a["A"][3:len(a[2])]
不会将[3, 4, [1, 2, 3]]
作为输出。
你得到一个KeyError: 2
。如果你获得了那个输出,你已经做了别的事情。
答案 1 :(得分:1)
使用此功能:
def trim_dictionary(d, trim=2):
return {k:v[:trim] for k,v in d.iteritems()}
示例:
>>> trim_dictionary({'A':[1,2,3,4], 'B':[5,6], 'C':[7,8,9], 'D':[10]})
{'A': [1, 2], 'B': [5, 6], 'C': [7, 8], 'D': [10]}
答案 2 :(得分:0)
使用词典理解:
>>> {k: [item for item in v if item <= 2] for k, v in a.iteritems()}
{'A': [1, 2], 'B': [1, 2]}
修改原始字典:
for k, v in a.iteritems():
... v[:] = [item for item in v if item <= 2]
...
>>> a
{'A': [1, 2], 'B': [1, 2]}
仅保留每个列表中的前两项:
for k in a:
a[k] = a[k][:2] #or del a[k][2:]
...
>>> a
{'A': [1, 2], 'B': [1, 2]}
答案 3 :(得分:0)
而不是
del a["A"][3:len(a[2])]
使用
a["A"] = a["A"][:2]
或
del a["A"][2:]
答案 4 :(得分:0)
得到(最大)前两个元素。
a["A"] = [1,2,3,4,5]
a["B"] = [1,2]
a["C"] = [1]
for key in a:
a[key] = a[key][:2]
如果您有大量数据,则检查列表长度可能会更快。
for key, value in a.items():
if len(value) > 2:
a[key] = value[:2]
方法3正在使用del
:
for value in a.values():
del value[2:]
在Python 3上测试的所有示例。