1

我有以下字典:

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)我将如何正确实施我正在尝试做的事情?

谢谢!

4

5 回答 5

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:仅在必要时添加 to slice 可能会略微提高性能。如果您希望大多数值长于 2,那么它只会增加开销。


关于你的第一个问题:做不作为del a["A"][3:len(a[2])]输出。你得到一个. 如果您获得了该输出,您已经做了其他事情。[3, 4, [1, 2, 3]]KeyError: 2

于 2013-09-09T07:45:18.940 回答
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]}
于 2013-09-09T07:47:48.043 回答
0

使用 dict 理解:

>>> {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]}
于 2013-09-09T07:27:03.113 回答
0

代替

del a["A"][3:len(a[2])]

利用

a["A"] = a["A"][:2]

或者

del a["A"][2:]
于 2013-09-09T07:37:42.977 回答
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 上测试的所有示例。

于 2013-09-09T07:42:22.823 回答