Лучший способ сравнить a в списке списка и добавить другое значение с помощью python

92
11

Я импортирую CSV, который имеет повторяющиеся значения во втором столбце и добавляет соответствующие значения в столбец 1.


64052,10.10.10.10,RED
3802,192.168.10.10,BLUE
488,10.10.10.10,RED

Я импортировал значения CSV в список списков, как показано ниже:


import csv

out = open('example1.csv','rb')
data = csv.reader(out)
data = [[row[0],row[1],row[2]] for row in data]
out.close

print data


['64052', '10.10.10.10 ',' RED '], [' 3802 ',' 192.168.10.10 ',' BLUE '], ['488', '10.10.10.10 ',' RED ']



Какой лучший способ просмотреть списки и если значение "второе" [1] соответствует, добавьте значения "сначала" [0]?


Это будет ожидаемый результат, который я пытаюсь выполнить:


['64540', '10.10.10.10 ',' RED '], [' 3802 ',' 192.168.10.10 ',' BLUE ']


спросил(а) 2016-11-08T12:11:00+03:00 4 года, 11 месяцев назад
1
Решение
65

Вы можете использовать defaultdict для отслеживания записей:


from collections import defaultdict

result = defaultdict(int)
for row in data:
key = (row[1], row[2])
result[key] += int(row[0])

Затем результат будет выглядеть следующим образом:


{
('10.10.10.10', 'RED'): 64540,
('192.168.10.10', 'BLUE'): 3802,
}

ответил(а) 2016-11-08T13:46:00+03:00 4 года, 11 месяцев назад
79

Вы можете легко сделать это, используя pandas:


import pandas as pd
df = pd.DataFrame([('64052', '10.10.10.10', 'RED'), ('3802', '192.168.10.10', 'BLUE'), ('488', '10.10.10.10', 'RED')], columns = ['Value', 'IP', 'Color'])
# You can import the whole .csv file using the .read_csv() method

df['Value'] = df['Value'].astype(int) # Cast to integers
df.groupby(['IP', 'Color']).sum()


Результат

In[39]: df.groupby(['IP', 'Color']).sum()
Out[37]:
Value
IP Color
10.10.10.10 RED 64540
192.168.10.10 BLUE 3802

Затем для извлечения кортежей в списке используйте итератор .itertuples()

ответил(а) 2016-11-08T14:05:00+03:00 4 года, 11 месяцев назад
47

Вы можете попробовать это. Это сработало для меня:
l = [['500', '192.168.10.100', 'RED'], ['64052', '10.10.10.10 ',' RED '], [' 3802 ',' 192.168.10.10 ',' BLUE '], ['488', '10.10.10.10 ',' RED '], [' 488 ', '10.10.10.10', 'RED'], ['500', '192.168.10.10', 'RED']]


Выход был = > [[65028, '10.10.10.10 ',' RED '], [4302,' 192.168.10.10 ',' BLUE '], [' 500 ',' 192.168.10.100 ',' RED ' ]]


data = [['500', '192.168.10.100', 'RED'],['64052', '10.10.10.10', 'RED'], ['3802', '192.168.10.10', 'BLUE'], ['488', '10.10.10.10', 'RED'],['488', '10.10.10.10', 'RED'],['500', '192.168.10.10', 'RED']]

key_l=[]
final_list=[]
l_index=[]
my_dict={}
for i in range(len(data)):
next_val = i+1
if next_val > len(data):
break
k=i+1
key_l=[]
for j in data[i+1:]:
if j[1] == data[i][1]:
if my_dict:
if j[1] in my_dict.keys():
k=k+1
continue
else:
key_l.append(k)
k=k+1
continue
else:
key_l.append(k)
k=k+1
else:
k=k+1
if key_l:
key_l.append(data.index(data[i]))
#make a dictionary with ip as key and values = indexes from list containing this ip
my_dict[(data[i][1])] = key_l

#iterate over each key and add the 0th value of each list element found at data[index]
for each_key in my_dict.keys():
new_val = 0
for value in my_dict[each_key]:
new_val += int(data[value][0])

data[value][0] = new_val
new_l = data[value]
final_list.append(new_l)

for val in my_dict.values():
l_index += val

#add those list elements which are left
for i in range(len(data)):
if i in l_index:
continue
else:
final_list.append(data[i])

print final_list

ответил(а) 2016-11-08T14:32:00+03:00 4 года, 11 месяцев назад
47

Вы можете сделать что-то вроде этого (предполагая, что число в индексе 0 является числом, а не строкой, иначе вы бы преобразовали его в число)


data = [
(64052,'10.10.10.10','RED'),
(3802, '192.168.10.10','BLUE'),
(488, '10.10.10.10','RED'),
]

ip_to_datum_map = {}

for datum in data:
number, ip_address, colour = datum
if ip_address in ip_to_datum_map:
existing_number = ip_to_datum_map[ip_address][0]
ip_to_datum_map[ip_address] = (existing_number + number, ip_address, colour)

else:
ip_to_datum_map[ip_address] = datum

print(ip_to_datum_map.values())

ответил(а) 2016-11-08T14:20:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема