2015-06-07 4 views
0

ниже - мой список списков;Python: добавление значения из списка списков

db_rows = [('a','b','c',4), 
      ('a','s','f',6), 
      ('a','c','d',6), 
      ('a','b','f',2), 
      ('a','b','c',6), 
      ('a','b','f',8), 
      ('a','s','f',6), 
      ('a','b','f',7), 
      ('a','s','f',5), 
      ('a','b','f',2)] 

, если первые три значения одинаковы во внутреннем списке, то мне нужно добавить 4-ое значение для создания нового списка

мне нужен список результат:

final_list = [('a','b','c',10), 
       ('a','s','f',17), 
       ('a','c','d',6), 
       ('a','b','f',19)] 

Я попытался ниже сценария (не работает):

final_list = [] 
for row in db_rows: 
    temp_flag=False 
    temp_list = [] 
    val = 0 
    for ref_row in db_rows: 
     if row != ref_row: 
      if row[0]==ref_row[0] and row[1]==ref_row[1] and row[2]==ref_row[2]: 
       val = val + ref_row[3] 
       temp_flag=True 
    temp_list=(row[0],row[1],row[2],val) 
    if temp_flag==False: 
     temp_list=row 
    final_list.append(temp_list) 

, пожалуйста, советую мне.

+0

Передача вашей попытки для достижения этого результата. –

+3

Попробуйте использовать словарь с первыми тремя значениями в качестве ключа. –

+0

Пожалуйста, исправьте желаемый выход. Это должно быть '('a', 'c', 'd', 6)' вместо '('a', 'b', 'd', 6)'. –

ответ

5

Использовать словарь, поскольку Dov Grobgeld прокомментировал, а затем перевести словарь обратно в список.

from collections import defaultdict 

db_rows = [('a','b','c',4), 
      ('a','s','f',6), 
      ('a','c','d',6), 
      ('a','b','f',2), 
      ('a','b','c',6), 
      ('a','b','f',8), 
      ('a','s','f',6), 
      ('a','b','f',7), 
      ('a','s','f',5), 
      ('a','b','f',2)] 

sums = defaultdict(int) 
for row in db_rows: 
    sums[row[:3]] += row[3] 

final_list = [key + (value,) for key, value in sums.iteritems()] 

Печать final_list выходы:

[('a', 'b', 'c', 10), ('a', 's', 'f', 17), ('a', 'b', 'f', 19), ('a', 'c', 'd', 6)] 

См collections.defaultdict.

1
from collections import defaultdict 
db_rows = [('a','b','c',4), 
      ('a','s','f',6), 
      ('a','c','d',6), 
      ('a','b','f',2), 
      ('a','b','c',6), 
      ('a','b','f',8), 
      ('a','s','f',6), 
      ('a','b','f',7), 
      ('a','s','f',5), 
      ('a','b','f',2)] 

d = defaultdict(int) 


for ele in db_rows: 
    d[ele[:-1]] += ele[-1] 

print([(k +(v,)) for k,v in d.items()]) 
0

Здесь я использую OrderedDict сохранить порядок, в котором найдены первые три значения.

from collections import OrderedDict 

db_rows = [('a','b','c',4), 
      ('a','s','f',6), 
      ('a','c','d',6), 
      ('a','b','f',2), 
      ('a','b','c',6), 
      ('a','b','f',8), 
      ('a','s','f',6), 
      ('a','b','f',7), 
      ('a','s','f',5), 
      ('a','b','f',2)] 

temp_dict = OrderedDict() 

for x in db_rows: 
    temp_dict[x[:3]] = temp_dict.get(x[:3], 0) + x[3] 

final_list = [k +(v,) for k,v in temp_dict.iteritems()] 

Теперь мы можем проверить значение final_list, которое дает желаемый результат в порядке, как указано выше.

final_list 
[('a', 'b', 'c', 10), 
('a', 's', 'f', 17), 
('a', 'c', 'd', 6), 
('a', 'b', 'f', 19)] 
Смежные вопросы