Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从字典中的值列表中删除元素?_Python_List_Dictionary - Fatal编程技术网

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]}