Python:从列表中删除元素中的值?

时间:2013-09-09 07:25:37

标签: python list dictionary

我有以下字典:

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)我如何正确实现我想要做的事情?

谢谢!

5 个答案:

答案 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上测试的所有示例。