2013-12-05 2 views
1

Я создал простую программу, чтобы взять список упрощенных функций sku и qty и добавить их в другой список. Однако, если sku уже во втором списке, я хотел бы просто увеличить количество, а не добавлять копию. Я пробовал несколько разных циклов for, и я не смог заставить его работать.Iterating Over List, Объединение величин

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] 

EDIT: Я просто понял, что не было достаточно ясно, в моей ОП. Я не хочу считать количество раз, когда появляется sku, я хочу добавить все количества. Возможно, что будет количество больше одного.

ответ

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]] 
+0

Почему Вы добавляете NewList и MyList? – Selecsosi

+0

@Selecsosi Потому что они сказали: «Я создал простую программу, чтобы взять список упрощенных функций sku и qty и добавить их в другой список». – MakeCents

+0

newList = [["null", 0]] # placeholder значение so second для функций цикла – Selecsosi

1

Загляните в класс collections.Counter в документации библиотеки python. Это не потребует никаких циклов.

2

Попробуйте использовать value_counts из панд libray так:

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(), чтобы получить его точно к вашему желаемому выходу.

* этот код не проверен

1

Как насчет этого?

Это является ДИКТ, что отображает 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]]) 
+0

Я думаю, что вы имели в виду, чтобы сделать каждый '= eachItem [0]' '= eachItem [1]' – MakeCents