2013-11-19 2 views
0

У меня есть список вложенных кортежей, в котором второй элемент на поплавок:Sum элемент внутри кортежа

l = [('drink', ['vodka', '9.2', 'beer', '6.3', 'alcohol', '5.4', 'gin', '2.1', 'liquid']), 
('evict', ['tenant', '66.0', 'squatter', '2.75', 'owner', '1.1', 'bum', '1.0', 'deadbeat', '1.0'])] 

Я хочу суммировать три первых пунктов в списке, и добавить результат к началу , как это:

l = [('drink', 20.9 ['vodka', '9.2', 'beer', '6.3', 'alcohol', '5.4', 'gin', '2.1']), 
('evict', 69.75 ['tenant', '66.0', 'squatter', '2.75', 'bum', '1.0', 'deadbeat', '1.0'])] 

Я использую код ниже:

sorted_by_sum=[] 
for t in l: 
    tup=[t[0]] 
    tup.append(t[1]) 
    tup.append(sum(float(x) for x in t[0][1:6:2])) 
    sorted_by_sum.append(tuple(tup)) 

Но я получаю ошибку:

ValueError: could not convert string to float: 'a' 

Любые подсказки о том, как исправить это? Я очень благодарю вас за это.

ответ

3

Вы хотите получить доступ к вторым элементам кортежа; не t[0] (строка):

tup.append(sum(float(x) for x in t[1][1:6:2])) 

, но сделать это в первый .append() заявление, а не второй.

Вы можете превратить весь цикл в списке понимание, используя кортеж распаковка, чтобы дать легче следовать имена двух элементов каждого кортежа:

sorted_by_sum = [(name, sum(float(x) for x in items[1:6:2]), items) 
       for name, items in l] 

Демо:

>>> l = [('drink', ['vodka', '9.2', 'beer', '6.3', 'alcohol', '5.4', 'gin', '2.1', 'liquid']), 
... ('evict', ['tenant', '66.0', 'squatter', '2.75', 'owner', '1.1', 'bum', '1.0', 'deadbeat', '1.0'])] 
>>> [(name, sum(float(x) for x in items[1:6:2]), items) for name, items in l] 
[('drink', 20.9, ['vodka', '9.2', 'beer', '6.3', 'alcohol', '5.4', 'gin', '2.1', 'liquid']), ('evict', 69.85, ['tenant', '66.0', 'squatter', '2.75', 'owner', '1.1', 'bum', '1.0', 'deadbeat', '1.0'])] 
+0

я работал красиво ! Спасибо огромное! Я соглашусь как можно скорее! – user3008918

Смежные вопросы