我创建了一个简单的程序来获取简化的sku和qty的列表并将其添加到另一个列表中。但是如果sku已经在第二个列表中,我想增加数量而不是添加副本。我尝试了一些不同的for
循环,但我无法让它工作。
myList = [["a",1],["c",1],["a",1]] #[sku, qty]
newList = [["null",0]] #placeholder value so second for loop functions
for eachItem in myList:
for eachNew in newList:
if eachItem[0] == eachNew[0]: # if sku is in list increment qty
eachNew[1] += eachItem[1]
myList.remove(eachItem)
else:
newList.append([eachItem[0], eachItem[1]]) #else add the sku to the list
myList.remove(eachItem)
#remove null place holder
for eachItem in newList:
if eachItem[0] == "null":
newList.remove(eachItem)
for eachItem in newList:
print(eachItem)
我想要的输出是:
['a', 2]
['c', 1]
编辑:我刚刚意识到我的OP不够清楚。我不想计算sku出现的次数我想要添加所有数量。数量可能超过一个。
答案 0 :(得分:2)
尝试使用pandas libray中的value_counts
,如下所示:
import pandas as pd
myList = [["a",1],["c",1],["a",1]]
myList = pd.Series(myList)
mylist.value_counts().to_list()
会是:
[['a',2],['c',1]]
就像这个例子
In [83]: data
array([4, 6, 6, 1, 2, 1, 0, 5, 3, 2, 4, 3, 1, 3, 5, 3, 0, 0, 4, 4, 6, 1, 0,
4, 3, 2, 1, 3, 1, 5, 6, 3, 1, 2, 4, 4, 3, 3, 2, 2, 2, 3, 2, 3, 0, 1,
2, 4, 5, 5])
In [84]: s = Series(data)
In [85]: s.value_counts()
3 11
2 9
4 8
1 8
5 5
0 5
6 4
dtype: int64
它背后的编程比for循环更有效,因为基础是用C语言编写的。你可以使用to_list()
方法mylist.value_counts().to_list()
来精确地得到你想要的输出。 / p>
答案 1 :(得分:1)
查看python库文档中的collections.Counter
类。它不需要任何循环。
答案 2 :(得分:1)
这样的事情怎么样?
这是一个dict,它将sku映射到数量,这将允许您将值聚合在一起并跟踪您已计算的内容
不要过于复杂化
myList = [["a",1],["c",1],["a",1]] #[sku, qty]
counter_dict = {} #schema {"sku": quantity:int }
for eachItem in myList:
if eachItem[0] in counter_dict:
counter_dict[eachItem[0]] += eachItem[1]
else:
counter_dict[eachItem[0]] = eachItem[1]
for key in counter_dict.keys():
print([key, counter_dict[key]])
答案 3 :(得分:0)
不像熊猫那么优雅,我无法弄清楚收藏品。对不起,这更像是你正在做的事情。它构建一个字典,然后再次理解构建列表。
mylist = [["a",1],["c",1],["a",1]]
newlist = [["null",0]]
mydict = {}
for i in mylist+newlist:
if i[0] in mydict:
mydict[i[0]]+=i[1]
elif i[0] != 'null':
mydict[i[0]]=i[1]
print [[x,mydict[x]] for x in mydict]
[['a', 2], ['c', 1]]