проблемы с моими вложенными циклами достигают результатов, аналогичных сумме - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь перебрать 2 списка, используя циклы for, чтобы вычислить сумму для каждой уникальной ссылки.Я полагаю, я ищу питонического суфифа!

# list of data ("user_ID", "contract_Number", "weight", "type")
list1 = [
    ('1','261','6.2','Input'),
    ('1','262','7.2','Input'),
    ('1','263','5.2','Input'),
    ('1','264','8.2','Input'),
    ('1','261','3.2','Input'),
    ('1','262','2.2','Input'),
    ('1','262','7.2','Input'),
    ('1','263','4.2','Input'),
    ('1','264','6.2','Input'),
    ('1','265','6.2','Input'),
    ('1','261','9.2','Input'),
    ('1','261','10.2','Input')
    ]

contract_list = []

# create a list of contract numbers
for data_row in list1:
    if data_row[0] == "1" and data_row[3] == "Input":
        contract_list.append(data_row[1])

#remove duplication - left with a list of unique contract numbers
contract_list = list(dict.fromkeys(contract_list))
print(contract_list)


# I'm trying this...[28.6, 16.6, 9.4, 14.4, 6.2]
tally_list = []
tally = 0
for c in contract_list:
    for l in list1:
        if data_row[0] == '1' and data_row[1] == contract_list[0]:
            tally = tally + float(data_row[2])
    tally_list.append(tally)

print(tally_list)

Я ожидаю ... ['261', '262', '263', '264', '265'] [28,6, 16,6, 9,4, 14,4, 6,2]

Я получаю ... ['261', '262', '263', '264', '265'] [122.40000000000002, 244.7999999999999, 367.1999999999999976,489,5999999999996, 612,0]

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Просто еще один подход с использованием defaultdict

from collections import defaultdict

list1 = [
    ('1','261','6.2','Input'),
    ('1','262','7.2','Input'),
    ('1','263','5.2','Input'),
    ('1','264','8.2','Input'),
    ('1','261','3.2','Input'),
    ('1','262','2.2','Input'),
    ('1','262','7.2','Input'),
    ('1','263','4.2','Input'),
    ('1','264','6.2','Input'),
    ('1','265','6.2','Input'),
    ('1','261','9.2','Input'),
    ('1','261','10.2','Input')
    ]

d = defaultdict(int)

for tup in list1:
    if tup[0] == '1' and tup[3] == 'Input':
        d[tup[1]] += float(tup[2])

contract_list = list(d)
print(contract_list)

tally_list = [format(v, '.1f') for v in d.values()]
print(tally_list)

Вывод:

['261', '262', '263', '264', '265']
['28.8', '16.6', '9.4', '14.4', '6.2']
0 голосов
/ 02 мая 2019
# I'm trying this...[28.6, 16.6, 9.4, 14.4, 6.2]
tally_list = []
tally = 0
for c in contract_list:
    for l in list1:   #<----------
        if data_row[0] == '1' and data_row[1] == contract_list[0]:
            tally = tally + float(data_row[2])
    tally_list.append(tally)

В отмеченной строке похоже, что вы хотите использовать переменную data_row вместо l


На самом деле, попробуйте это, вам нужно дополнительно сбросить tallyи также используйте c вместо contract_list[0] в конечном выражении if.

# I'm trying this...[28.6, 16.6, 9.4, 14.4, 6.2]
tally_list = []
tally = 0
for c in contract_list:
    for data_row in list1:        
        if data_row[0] == '1' and data_row[1] == c: #<----
            tally = tally + float(data_row[2])
    tally_list.append(tally)
    tally=0 #<---



print(tally_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...