【问题标题】:Python dictionary from list of lists列表列表中的 Python 字典
【发布时间】:2022-01-18 03:59:21
【问题描述】:

我正在尝试生成一个字典来计算具有条件的列表列表中的项目。我试图将结果作为元组中的值获取,例如,如果我的初始数据是这样的列表列表:

my_list = [[(1,2),5],[(1,2),9],[(2,3),0],[(2,3),2],[(1,2),5],[(1,2),9],[(2,3),5]]

期望的结果将是一个字典,其中键是每个列表的第一个元素。字典的值将是两个元素的元组,具有相同键的项目数(总计数)以及第二个项目有多少值为 5(条件计数)。

dict_desired = {(1,2):(4,2),(2,3):(3,1)}

我这样做了,但似乎不是很整洁,我想知道是否有更多 python 经验的人可以帮助我构建它,也许使用理解。

提前致谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!如果代码有效并且您正在寻找改进它的建议,Code Review 是合适的地方。但请先查看codereview.meta.stackexchange.com/questions/5777/…
  • 听起来是 collections.Counter 的好用例
  • 你有没有尝试过任何东西
  • 您的操作基本上是一个分组,这不是您可以使用推导式有效实现的东西(用于表达 映射/过滤 操作,这需要您在每次迭代中重新迭代整个事物,当你可以在一个单一的线性通道中分组时)
  • @juanpa.arrivillaga 发帖人声称有一些代码,因此有权获得质疑(尤其是作为 Stack Overflow 的新贡献者)????

标签: python list dictionary


【解决方案1】:

执行此操作的 Pythonic 高效方法是使用循环:

my_list = [[(1,2),5],[(1,2),9],[(2,3),0],[(2,3),2],[(1,2),5],[(1,2),9],[(2,3),5]]
result = {}
empty = 0, 0

for key, value in my_list:
    count, fives = result.get(key, empty)
    result[key] = (count + 1, fives + (value == 5))

要使用推导式执行此操作,您需要在每次迭代时遍历列表,例如:

result = {
    key:(
        sum(k == key for k,_ in my_list),
        sum(v == 5 for k,v in my_list if k == key)
    ) for key, value in my_list
}

这是非常不合常规且效率低下的。您也许可以先尝试从键中创建一个集合,但它仍然不会像常规的 for 循环那样高效,也许有一些使用赋值表达式的 hacky 方法可以使其有效地工作,但它肯定赢了'不要整洁

所以,你有一个很好的、可读的、线性时间的 for 循环,而不是一个复杂的、不可读的二次时间字典理解。选择很明确,IMO。

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多