2015-06-15 7 views
0

У меня есть строка выглядит следующим образом:Python 3.4: Список словарю

['Total Revenue', 31821000, 30871000, 29904000, 'Cost of Revenue', 16447000, 16106000, 15685000, 'Gross Profit', 15374000, 14765000, 14219000, 'Research Development', 1770000, 1715000, 1634000, 'Selling General and Administrative', 6469000, 6384000, 6102000, 'Non Recurring', '-', '-', '-', 'Others', '-', '-', '-', 'Total Operating Expenses', '-', '-', '-', 'Operating Income or Loss', 7135000, 6666000, 6483000, 'Total Other Income/Expenses Net', 33000, 41000, 39000, 'Earnings Before Interest And Taxes', 7168000, 6707000, 6522000, 'Interest Expense', 142000, 145000, 171000, 'Income Before Tax', 7026000, 6562000, 6351000, 'Income Tax Expense', 2028000, 1841000, 1840000, 'Minority Interest', -42000, -62000, -67000, 'Net Income From Continuing Ops', 4956000, 4659000, 4444000, 'Discontinued Operations', '-', '-', '-', 'Extraordinary Items', '-', '-', '-', 'Effect Of Accounting Changes', '-', '-', '-', 'Other Items', '-', '-', '-', 'Net Income', 4956000, 4659000, 4444000, 'Preferred Stock And Other Adjustments', '-', '-', '-', 'Net Income Applicable To Common Shares', 4956000, 4659000, 4444000] 

есть модель, которая составляет 1: 3 в списке. В любом случае я могу преобразовать этот список в словарь, как показано ниже.

{Total Revenue : [31821000, 30871000, 29904000], Cost of Revenue : [16447000, 16106000, 15685000] ... ... ... } 

Я думаю, что это можно сделать с помощью понимания словаря.

+1

Вы пытались использовать понимание словаря? Можете ли вы включить код из своих попыток? –

ответ

4

Вы можете использовать распаковку операцию в Словаре понимания:

>>> my_dict={i:j for i,*j in [l[i:i+4] for i in range(0,len(l),4)]} 
>>> my_dict 
{'Non Recurring': ['-', '-', '-'], 'Total Other Income/Expenses Net': [33000, 41000, 39000], 'Selling General and Administrative': [6469000, 6384000, 6102000], 'Net Income From Continuing Ops': [4956000, 4659000, 4444000], 'Effect Of Accounting Changes': ['-', '-', '-'], 'Net Income Applicable To Common Shares': [4956000, 4659000, 4444000], 'Net Income': [4956000, 4659000, 4444000], 'Other Items': ['-', '-', '-'], 'Others': ['-', '-', '-'], 'Earnings Before Interest And Taxes': [7168000, 6707000, 6522000], 'Income Before Tax': [7026000, 6562000, 6351000], 'Extraordinary Items': ['-', '-', '-'], 'Total Operating Expenses': ['-', '-', '-'], 'Interest Expense': [142000, 145000, 171000], 'Preferred Stock And Other Adjustments': ['-', '-', '-'], 'Gross Profit': [15374000, 14765000, 14219000], 'Total Revenue': [31821000, 30871000, 29904000], 'Income Tax Expense': [2028000, 1841000, 1840000], 'Operating Income or Loss': [7135000, 6666000, 6483000], 'Cost of Revenue': [16447000, 16106000, 15685000], 'Minority Interest': [-42000, -62000, -67000], 'Research Development': [1770000, 1715000, 1634000], 'Discontinued Operations': ['-', '-', '-']} 

И если вы хотите, чтобы сохранить заказ вы можете использовать collections.OrderedDict:

>>> from collections import OrderedDict 
>>> my_dict=OrderedDict((i,j) for i,*j in [l[i:i+4] for i in range(0,len(l),4)]) 
>>> my_dict 
OrderedDict([('Total Revenue', [31821000, 30871000, 29904000]), ('Cost of Revenue', [16447000, 16106000, 15685000]), ('Gross Profit', [15374000, 14765000, 14219000]), ('Research Development', [1770000, 1715000, 1634000]), ('Selling General and Administrative', [6469000, 6384000, 6102000]), ('Non Recurring', ['-', '-', '-']), ('Others', ['-', '-', '-']), ('Total Operating Expenses', ['-', '-', '-']), ('Operating Income or Loss', [7135000, 6666000, 6483000]), ('Total Other Income/Expenses Net', [33000, 41000, 39000]), ('Earnings Before Interest And Taxes', [7168000, 6707000, 6522000]), ('Interest Expense', [142000, 145000, 171000]), ('Income Before Tax', [7026000, 6562000, 6351000]), ('Income Tax Expense', [2028000, 1841000, 1840000]), ('Minority Interest', [-42000, -62000, -67000]), ('Net Income From Continuing Ops', [4956000, 4659000, 4444000]), ('Discontinued Operations', ['-', '-', '-']), ('Extraordinary Items', ['-', '-', '-']), ('Effect Of Accounting Changes', ['-', '-', '-']), ('Other Items', ['-', '-', '-']), ('Net Income', [4956000, 4659000, 4444000]), ('Preferred Stock And Other Adjustments', ['-', '-', '-']), ('Net Income Applicable To Common Shares', [4956000, 4659000, 4444000])]) 

Также как более пифонический и эффективный способ группировки списка, вы можете использовать следующие Функция окуня из питона itertools recipes

>>> def grouper(iterable, n, fillvalue=None): 
...  "Collect data into fixed-length chunks or blocks" 
...  # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
...  args = [iter(iterable)] * n 
...  return zip_longest(*args, fillvalue=fillvalue) 
... 
>>> 
>>> from itertools import zip_longest 
>>> my_dict=OrderedDict((i,j) for i,*j in grouper(l,4)) 
>>> my_dict 
OrderedDict([('Total Revenue', [31821000, 30871000, 29904000]), ('Cost of Revenue', [16447000, 16106000, 15685000]), ('Gross Profit', [15374000, 14765000, 14219000]), ('Research Development', [1770000, 1715000, 1634000]), ('Selling General and Administrative', [6469000, 6384000, 6102000]), ('Non Recurring', ['-', '-', '-']), ('Others', ['-', '-', '-']), ('Total Operating Expenses', ['-', '-', '-']), ('Operating Income or Loss', [7135000, 6666000, 6483000]), ('Total Other Income/Expenses Net', [33000, 41000, 39000]), ('Earnings Before Interest And Taxes', [7168000, 6707000, 6522000]), ('Interest Expense', [142000, 145000, 171000]), ('Income Before Tax', [7026000, 6562000, 6351000]), ('Income Tax Expense', [2028000, 1841000, 1840000]), ('Minority Interest', [-42000, -62000, -67000]), ('Net Income From Continuing Ops', [4956000, 4659000, 4444000]), ('Discontinued Operations', ['-', '-', '-']), ('Extraordinary Items', ['-', '-', '-']), ('Effect Of Accounting Changes', ['-', '-', '-']), ('Other Items', ['-', '-', '-']), ('Net Income', [4956000, 4659000, 4444000]), ('Preferred Stock And Other Adjustments', ['-', '-', '-']), ('Net Income Applicable To Common Shares', [4956000, 4659000, 4444000])]) 
+1

Фантастический ответ. –

+1

@ Kasra Beautiful! –

0

действительно он может:

assert len(lst) % 4 == 0 
{lst[4*i]: lst[4*i+1:4*(i+1)] for i in range(len(lst)/4)} 
+2

Этот ответ просто неверен. 'for i in len (lst)/4' скажет вам, что объект int (в Python 2) или float (Python 3) не является итерируемым. Если бы не исправлено, я бы проголосовал за закрытие. Даже с этим исправлением это все еще непонятно из-за всей арифметики с индексами, поэтому даже когда это не ошибка, это не очень хороший ответ. – holdenweb

+0

Он хотел использовать 'range (len (lst)/4)' очевидно. Ужасно. ;-) – woot

1

Я бы вспомогательную функцию, которая принимает данные и генерирует его на куски, вместе с ключом:

def generate_revenues(data): 
    data = iter(data) 
    while True: 
     key = next(data) 
     values = [next(data), next(data), next(data)] 
     yield key, values 

Making словаря является то так просто, как :

>>> dict(generate_revenues(data)) 

, который дает:

{'Cost of Revenue': [16447000, 16106000, 15685000], 
'Discontinued Operations': ['-', '-', '-'], 
'Earnings Before Interest And Taxes': [7168000, 6707000, 6522000], 
... 
'Total Operating Expenses': ['-', '-', '-'], 
'Total Other Income/Expenses Net': [33000, 41000, 39000], 
'Total Revenue': [31821000, 30871000, 29904000]} 

Техническое примечание для людей из будущего: Генератор вызывает исключение StopIteration, чтобы остановить итерацию. В будущей версии Python это будет запрещено, и вам нужно будет охранять вызовы до next с помощью блока try: except StopIteration:.

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