迭代列表,组合数量

时间:2013-12-05 03:45:02

标签: python loops

我创建了一个简单的程序来获取简化的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出现的次数我想要添加所有数量。数量可能超过一个。

4 个答案:

答案 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]]