Python:从字典中的值列表中删除元素?
我有以下字典:Python:从字典中的值列表中删除元素?,python,list,dictionary,Python,List,Dictionary,我有以下字典: a=dict() a[“a”]=[1,2,3,4,5] a[“B”]=[1,2] 我希望遍历字典中的每个值(在本例中是列表形式),如果列表中的元素数大于2,我希望删除第二个元素之后的所有元素 例如,更改值后,我的字典应该是: a[“a”]=[1,2]#[3,4,5]从该值中删除 a[“B”]=[1,2] 我试过: dela[“a”][3:len(a[2])] 但结果是: [3,4,1,2,3] 两个问题: 1) 为什么我尝试的结果是这样的? 2) 我如何正确地实施我正在尝试做的事
a=dict()
a[“a”]=[1,2,3,4,5]
a[“B”]=[1,2]
我希望遍历字典中的每个值(在本例中是列表形式),如果列表中的元素数大于2,我希望删除第二个元素之后的所有元素
例如,更改值后,我的字典应该是:
a[“a”]=[1,2]#[3,4,5]从该值中删除
a[“B”]=[1,2]
我试过:
dela[“a”][3:len(a[2])]
但结果是:
[3,4,1,2,3]
两个问题:
1) 为什么我尝试的结果是这样的?
2) 我如何正确地实施我正在尝试做的事情
谢谢 使用听写理解:
>>> {k: [item for item in v if item <= 2] for k, v in a.iteritems()}
{'A': [1, 2], 'B': [1, 2]}
而不是
del a["A"][3:len(a[2])]
使用
或
只需获取(最大)前两个元素
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上测试的所有示例。实现所需内容的最简单方法是“按字面意思编写”: 可以理解为: 对于字典中的每个值,删除 第二 请注意:
- 此解决方案不会创建新词典,而是修改原有词典
- 此解决方案不会创建新列表。它修改当前的列表
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,那么这只会增加开销
关于你的第一个问题: 执行
dela[“a”][3:len(a[2])]
不会将[3,4,1,2,3]]
作为输出。
您会得到一个键错误:2
。如果您获得了该输出,您还做了其他事情。使用此功能:
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]}
使用itertools.filter()修改原始字典可能更简洁,您使用v[:]而不是v有什么原因吗?我更喜欢使用LC而不是带有lambda的
filter
。@user2241856[:]
用于修改同一对象,您也可以这样做:a[k]=[v if item中的item for item感谢您的解释。我还有一个问题:在您的解决方案中,只有当元素是dela[“a”][3:len(a[2])]时,您才保留它们。
引发了键错误
。事实上,将[1,2,3,4,5]
转换为[3,4,2,3]]
到单个表达式中,因为分配给切片不会插入子列表。顺便说一句,[2]是什么?很好的解决方案。用户应该知道trim_dictionary正在替换旧值(列表)使用新的onesNice解决方案。用户应该知道,trim_dictionary正在修改原始列表。您的计时方法不标准-您正在使用项
,而不是iteritems
,来模拟我的答案(这会使答案失效)更不用说您的数据集非常有限。@我使用的是python3,因此items()
是正确的方法。此外,我不知道计时方法如何“不标准”.timeit
是您必须用来分析小基准的模块,ipython
为该模块提供了一个简单的接口。您的解决方案正在做不同的工作,每个都有其独特的副作用。比较它们的性能没有多大意义……两种解决方案都很好。
for value in dictionary.values():
del value[2:]
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
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]}