【问题标题】:Adding a Dict item to a list and appending values having same key to a newer list item将字典项添加到列表并将具有相同键的值附加到较新的列表项
【发布时间】:2019-02-11 13:07:37
【问题描述】:

我有以下实现:

from collections import defaultdict
from collections import OrderedDict

prod = [
    [1, 'tomato', 'veg', 'Jan-1'],
    [1, 'banana', 'fruit', 'Jan-3'],
    [2, 'melon', 'fruit', 'Jan-2'],
    [3, 'apple', 'fruit', 'Jan-4'],
    [2, 'cucumber', 'veg', 'Jan-1']
]

d = defaultdict(list)

for i in range (0, len(prod)):
    f_name = prod[i][1]
    f_type = prod[i][2]
    f_date = prod[i][3]

    key = prod[i][0]

    d[key].append([f_name, f_type, f_date])

e = OrderedDict(sorted(d.items(), key=lambda t: t[0]))
print ("***************")
print (e)

table_for_graph = []

for key, value in e.iteritems():
    table_for_graph.append(value)

print (table_for_graph)

我得到的输出是这样的:

[[['tomato', 'veg', 'Jan-1'], ['banana', 'fruit', 'Jan-3']], [['melon', 'fruit', 'Jan-2'], ['cucumber', 'veg', 'Jan-1']], [['apple', 'fruit', 'Jan-4']]]

我想创建一个这样的列表:

[
    ['tomato''\n''banana','veg''\n''fruit','Jan-1''\n''Jan-3'],
    ['melon''\n''cucumber','fruit''\n''veg','Jan-2''\n''Jan-1'],
    ['apple','fruit','Jan-4']
]

意思是,我想连接具有相同键的项目。 我该怎么做?我还不熟悉遍历 dict。

【问题讨论】:

  • 如果你不熟悉迭代字典,你是如何得到代码的?
  • 你能检查一下你的输出吗?分隔符不一致。
  • 另外,请添加一个普通的 Python 标签
  • 感谢疯狂的物理学家!我正在尝试通过编码学习:)
  • range (0, len(prod)) == range(len(prod)) 你可能更愿意使用for el in prod 或者更好地重命名for product in products

标签: python dictionary collections


【解决方案1】:

首先,构造字典的循环可以大大简化,因为解包和重新打包是多余的,除非您需要重新排序元素:

for item in prod:
    d[item[0]] = item[1:]

其次,table_graph 最初根本不需要循环:

table_for_graph = e.values()

这里的每一项都是一个嵌套列表,比如:

>>> e[1]
[['tomato', 'veg', 'Jan-1'],
 ['banana', 'fruit', 'Jan-3']]

您可以通过将位压缩在一起来有效地转置它:

>>> zip(*e[1])
[['tomato', 'banana'],
 ['veg', 'fruit'],
 ['Jan-1', 'Jan-3']]

把它们放在一起:

 >>> [s in line for line in zip(*e[1]) for s in line]
 ['tomato', 'banana', 'veg', 'fruit', 'Jan-1', 'Jan-3']

您可以在字典的每个元素上运行该表达式:

table_for_graph = [[s for line in zip(*value) for s in line] for value in e.itervalues()]

【讨论】:

  • 您好 MadPhysicist,输出不是我所期望的。输出粘贴如下:[[真,真,真,真,真,真,真,真,真,真,真,真,真,真,真],[真,真,真,真,真,真,真,真,真],[真,真,真,真,真,真,真,真,真,真,真,真,真,真,真]]
  • @DeepakV。修正错字。谢谢你的收获。
猜你喜欢
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多