【问题标题】:Atribbuting values to a dictionary in pyhon 3.x [duplicate]在python 3.x中将值归因于字典[重复]
【发布时间】:2018-12-07 17:03:57
【问题描述】:

我想为字典 (dicio) 赋予一个值,其中 KEYS = 列表中数字的计数,VALUES = 具有该计数的数字。

只是想知道为什么会这样:

for elem in list_A:

    dicio[list_A.count(elem)] = dicio.setdefault(list_A.count(elem),[]) + [elem]

这不会(使用 .append 或 .extend):

for elem in list_A:

    dicio[list_A.count(elem)] = dicio.setdefault(list_A.count(elem),[]).extend([elem])

【问题讨论】:

  • extend 不返回修改后的列表;它返回None
  • 你在这两种情况下都错误地使用了setdefault,首先它恰好起作用,因为连接运算符返回值
  • 对于第二个例子来说,for elem in list_A: dicio.setdefault(list_A.count(elem),[]).extend([elem]) 是正确的。

标签: python python-3.x dictionary key


【解决方案1】:

您应该遍历 list_A 中的值的 set,因为这样您就不会一遍又一遍地计数(效率更高)。

然后,您可以将已创建(或先创建然后添加)的键添加到列表中,该列表中的元素重复出现在 list_A 中的次数。

也就是说:

dicio = {}
for elem in set(list_A):
    count = list_A.count(elem)
    dicio[count] = dicio.setdefault(count, []) + [elem] * count

例子:

>>> list_A = [1, 2, 2, 2, 1, 5, 1, 7, 5, 7, 3]
>>> dicio = {}
>>> for elem in set(list_A):
...     count = list_A.count(elem)
...     dicio[count] = dicio.setdefault(count, []) + [elem] * count
... 
>>> dicio
{3: [1, 1, 1, 2, 2, 2], 1: [3], 2: [5, 5, 7, 7]}

请注意,这不能以看起来更简洁的方式完成:dicio.setdefault(count, []).append([elem] * count),因为这会附加一个列表,而不是单个元素,因此我们重新分配将前一个列表与我们的新元素连接的结果。

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 2018-12-02
    • 2013-11-19
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多