gpt4 book ai didi

Python创建列表列表,其中第一项的长度为1,第二项的长度为n?

转载 作者:行者123 更新时间:2023-11-28 21:35:20 25 4
gpt4 key购买 nike

我在 python 中创建列表列表时遇到问题。假设我有以下列表:

fruitlist = [('Vendor A', 'Apples'),
('Vendor B', 'Apples'),
('Vendor C', 'Bananas'),
('Vendor A', 'Grapes'),
('Vendor A', 'Bananas'),
('Vendor B', 'Oranges')]

我想要做的是创建这样的列表:[[供应商 A,(苹果,葡萄,香蕉)],[供应商 B,(苹果,橙子)],[供应商 C,(香蕉)] ]

所以基本上是供应商,然后是他们的产品。这是我目前拥有的代码,它基本上会遍历并提取供应商列表,然后循环并捕获每个产品,但是,输出并不完全是我想要的。

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 函数是否随机分配顺序?

最佳答案

集合只是元素的集合,没有像列表那样的顺序。

我编写此代码的方式是创建一个字典,然后,当我们将其转换为列表时,我们可以对其进行排序以匹配输入顺序。

fruitlist = [('Vendor A', 'Apples'),
('Vendor B', 'Apples'),
('Vendor C', 'Bananas'),
('Vendor A', 'Grapes'),
('Vendor A', 'Bananas'),
('Vendor B', 'Oranges')]
vendors = {}
for vendor, fruit in fruitlist:
vendors.setdefault(vendor, []).append(fruit)
ordered_fruitlist_vendors = [t[0] for t in fruitlist]
vendors_list = [[k, tuple(v)] for k,v in vendors.items()]
vendors_list.sort(key=lambda t: ordered_fruitlist_vendors.index(t[0]))

其中 vendors_list 为:

[['Vendor A', ('Apples', 'Grapes', 'Bananas')], ['Vendor B', ('Apples', 'Oranges')], ['Vendor C', ('Bananas',)]]

但是我怀疑将一个简洁的字典转换为这个带有元组的 2 元素列表的笨重列表是否有必要。当然,您希望能够使用 vendors['Vendor A']O(1) 时间内从供应商处检索水果,而不必迭代此列表会是O(n)吗?无论如何,这两种方法现在都是选项!


setdefault 的说明。

字典的 setdefault 方法采用两个参数 - 一个键和一个值。如果字典中已经存在该键,则返回当前值,否则使用传递到函数的值创建键并返回该值。

例如:

>>> d = {1:2}
>>> d.setdefault(1,3)
2
>>> d
{1: 2}
>>> d.setdefault(3,4)
4
>>> d
{1: 2, 3: 4}

因此,使用此方法的一个巧妙技巧是将键设置为空列表 ([])。然后,如果我们还没有该 key (在我们的例子中尚未看到供应商),则返回一个空列表。否则,我们会得到对列表的引用,其中包含我们迄今为止看到的所有供应商的水果。美妙之处在于,我们可以将新水果添加到返回的任何内容中,并且将为该供应商创建一个新条目并附加新水果,或者如果该供应商已经存在,我们将仅附加到之前创建的列表。

这意味着我们只需迭代 fruitlist 一次,因此解决方案非常高效。


该方法在列表中的另一个示例:

>>> d = {}
>>> d.setdefault(1, []).append(2)
>>> d
{1: [2]}
>>> d.setdefault(1, []).append(3)
>>> d.setdefault(1, []).append(4)
>>> d
{1: [2, 3, 4]}
>>> d.setdefault(2, []).append(3)
>>> d.setdefault(2, []).append(3)
>>> d.setdefault(2, []).append(3)
>>> d
{1: [2, 3, 4], 2: [3, 3, 3]}

关于Python创建列表列表,其中第一项的长度为1,第二项的长度为n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com