【发布时间】:2018-09-17 19:54:20
【问题描述】:
我在 python 中创建列表时遇到问题。假设我有以下列表:
fruitlist = [('Vendor A', 'Apples'),
('Vendor B', 'Apples'),
('Vendor C', 'Bananas'),
('Vendor A', 'Grapes'),
('Vendor A', 'Bananas'),
('Vendor B', 'Oranges')]
我想做的是创建这样的列表:[[Vendor A, (Apples, Grapes, Bananas)], [Vendor B, (Apples, Oranges)], [Vendor C, (Bananas)]]
所以基本上是供应商,然后是他们的产品。这是我目前拥有的代码,它基本上会遍历并仅提取供应商列表,然后循环遍历并捕获每个产品,但是,输出并不是我想要的。
vendors = list(set([x[0] for x in fruitlist]))
# this creates a list of just vendors:
output = [[] for x in range (len(vendors))]
#This creates a list with 3 empty lists inside (one for each vendor) where my output will be housed
for x in range(0,len(vendors)):
for y in range(0,len(fruitlist)):
if fruitlist[y][0] == vendors[x]:
output[x].append(fruitlist[y][1])
输出看起来像这样:
[['Apples', 'Oranges'], ['Apples', 'Grapes', 'Bananas'], ['Bananas']]
所以输出现在按供应商细分,每个供应商的产品现在都在自己的列表中,但现在我必须弄清楚如何在其中插入供应商名称,而我根本做不到。如果我在 for 循环的附加部分中包含供应商名称,
output[x].append((fruitlist[y][0],fruitlist[y][1]))
它会重复每个水果的供应商名称。如果我使用插入方法,它似乎创建了一个全新的项目,并增加了列表的长度。我尝试了一些事情,我尝试过谷歌搜索,但我无法找出正确的措辞。如果有人能指出我正确的方向,我将不胜感激。
当我查找供应商时,任何人都可以解释为什么:
['Vendor B', 'Vendor A', 'Vendor C']
它把“B”放在“A”之前?在我的原始列表 A 中,set 函数是否随机分配顺序?
【问题讨论】:
-
套装是_un_ordered。它们的打印方式取决于您放入的内容,并且可能会发生变化。为什么不使用字典 vendorname->productlist?
-
试试
collections.defaultdict -
你真的需要一个列表列表吗?列表的字典可能是更好的选择。如果您需要供应商按特定顺序排列,您可以使用 OrderedDict 或 Python 3.6+
-
是的,它不需要是一个列表,我之前没有真正使用过dicts,我可以试试,ty 的建议
-
你的问题是一种XY问题:因为你不熟悉你试图做某事的字典,这比字典简单得多,使用列表列表,导致一些严重的并发症.其他答案解决了您问题的这个 XY 方面,建议使用字典。 My answer below 从表面上理解您的问题,并展示了一种使用列表列表解决问题的简单方法。