【问题标题】:Is there a pythonic way to grab the total amount of variables within lists inside a dict?有没有一种pythonic方法来获取字典内列表中的变量总数?
【发布时间】:2013-02-12 20:17:44
【问题描述】:

我有一本字典,其中每个键都有一个项目列表(向量):

from collections import defaultdict
dict = defaultdict(list)
dict[133] = [2,4,64,312]
dict[4] = [2,3,5,12,45,32]
dict[54] = [12,2,443,223]

def getTotalVectorItems(items):
  total = 0
  for v in items.values():
    total += len(v)
  return total

print getTotalVectorItems(dict)

这将打印:

14 # number of items in the 3 dict keys.

除了创建这个“getTotalVectorItems”函数之外,还有更简单的 Pythonic 方法吗?我觉得已经有一种快速的方法可以做到这一点。

【问题讨论】:

  • sum(map(len,dic.values())),不要使用dict作为变量名。
  • 您在这里使用defaultdict 是否有原因(可能在您省略的代码中)?您的代码同样适用于 d = {}; d[133] = [2,4,64,312] 等。
  • 或者,更好的是:d = {133: [2, 4, 64, 312], 4: [2, 3, 5, 12, 45, 32], 54: [12, 2, 443, 223]} - 这不是 Java,我们有 dict 文字。
  • @AshwiniChaudhary 抱歉,我的伪代码写得不好。我会给你的代码一个镜头。我使用 defaultdict 因为它是使用列表作为 dict 键值的唯一方法(或者我被告知)。
  • @lattyware 哦,谢谢,我没有意识到我能做到。

标签: python list dictionary python-2.7


【解决方案1】:

您正在寻找带有generator expressionthe sum() built-in

sum(len(v) for v in items.values())

sum() 函数对给定迭代器的值求和,生成器表达式产生列表中每个值的长度。

请注意,调用列表向量可能会让大多数 Python 程序员感到困惑,除非您在问题领域的上下文中使用术语向量。

【讨论】:

  • 是的,但我说“我想要一个带有列表值的字典”听起来很奇怪。在python中很难区分名词/动词列表和特殊结构列表。谢谢,我会在我的代码中尝试这两个答案,看看哪个更快。
  • 感谢您的出色回答,但我的测试显示其他“地图”方法对于大型词典似乎更快。两者都是正确的。
【解决方案2】:
print sum(map(len,dic.itervalues()))

【讨论】:

  • { 1: 000576, 2: 000405; 1:000942、2:000622; 1:000655、2:000442; 1:000520、2:000436; 1:000594、2:000442;您的方法 (2) 似乎比 Lattyware 的方法更快。
  • @Dexter 谢谢。在 Python 2 中,如果你使用 imap 肯定会更快,但我没有把它放在我的答案中,因为它需要导入。在 Python 3 中,map 已经是一个生成器(或迭代器,我从不提醒是哪一个) - 此外,使用 itervalues() 比使用创建新对象的 items.values() 更快。
  • 太棒了,我马上试试。是的,我暂时不会使用 Python 3,但很高兴知道。
  • 我不知道为什么,但 imap 和 map 之间似乎没有太大的速度差异。有时一个看起来比另一个更快,有时则完全相反(请记住,我不包括导入时间)。具有讽刺意味的是,将 lambda 与这些东西一起使用有时会提高速度(而不是调用 3 个函数 4 次,而是调用 1 个函数 4 次)。但看起来你大多是对的:i.imgur.com/VYYfkG5.png
  • @Dexter 我对你说的话感到困惑。我非常相信imap 会更快,以至于我写“肯定”虽然犹豫“可能”。我想了解,虽然速度至少没有一点提高。
猜你喜欢
  • 2020-07-08
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2020-04-21
  • 2020-03-30
  • 2019-10-29
相关资源
最近更新 更多