从列表中提取数据并创建字典

时间:2018-03-31 11:09:38

标签: python data-analysis

您好我是Python的新手。我有一个包含

的列表
[['year', 'month', 'date_of_month', 'day_of_week', 'births'], 
['1994', '1', '1', '6', '8096'], 
['1994', '1', '2', '7', '7772'], 
['1994', '1', '3', '1', '10142'], ......]

我想创建一个像

这样的词典
days_counts = {
    0: 10000,
    1: 10000,
    2: 10000,
    ...
}

键是 day_of_week 值,来自 1到7 和价值是当天的总出生人数。

4 个答案:

答案 0 :(得分:1)

使用mStreetViewPanorama.setPosition(location, 50, StreetViewSource.OUTDOOR);的一种方式:

defaultdict

其中from collections import defaultdict bdays = defaultdict(int) for entry in mylist[1:]: bdays[int(entry[3])] += int(entry[4]) 是您的列表。另一种方式,使用mylist过度杀伤,并且使用实际知道键的内容的事实是短整数,所以你根本不需要字典:

import

或者以更简洁,也许不太可读的方式:

bdays = [0 for _ in range(7)]
for entry in mylist:
    bdays[int(entry[3])] += int(entry[4])

或坚持list((sum(int(x[4]) for x in mylist[1:] if int(x[3]) == i) for i in range(1,8)))

dict

所有这些确保0 b天日也列出0(也许是一个劣势?)。

第一种解决方案的缺点(至少从一个角度来看)任何密钥都是有效的,默认情况下返回0。

最后两个比较慢,因为它们迭代dict(((i,sum(int(x[4]) for x in mylist[1:] if int(x[3]) == i)) for i in range(1,8))) 7次。

答案 1 :(得分:1)

像这样:!?

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import BooleanProperty

Builder.load_string('''
<MainApp>:
    orientation: 'horizontal'
    rows: 2

    TestButton:
        text: 'Change value'
        on_release: self.change_value()
    TestLabel:
''') 


class TestLabel(Label):
    testing = BooleanProperty()

    def __init__(self, **kwargs):
        super(TestLabel, self).__init__(**kwargs)
        self.app = App.get_running_app()
        self.testing = self.app.testing
        self.bind(testing=self.changed_value)

    def changed_value(self, _instance, newvalue):
        self.text = str(newvalue)


class TestButton(Button):

    def __init__(self, **kwargs):
        super(TestButton, self).__init__(**kwargs)
        self.app = App.get_running_app()

    def change_value(self):
        self.app.testing = not self.app.testing


class MainApp(BoxLayout):
    pass


class TestApp(App):
    testing = BooleanProperty(False)

    def build(self):
        return MainApp()


if __name__ == '__main__':
    TestApp().run()

答案 2 :(得分:0)

你也可以这样做:

l = [['year', 'month', 'date_of_month', 'day_of_week', 'births'], 
['1994', '1', '1', '6', '8096'], 
['1994', '1', '2', '7', '7772'], 
['1994', '1', '3', '1', '10142']]

births = []
for i in range(1,8):
    births.append([i, sum(int(elem[4]) for elem in l if elem[3] == str(i))])

births = dict(births)

print(births)

输出:

{1: 10142, 2: 0, 3: 0, 4: 0, 5: 0, 6: 8096, 7: 7772}

或上述的简化版本:

births = dict([[i, sum(int(elem[4]) for elem in l if elem[3] == str(i))] for i in range(1,8)])

您也可以使用map功能执行此操作:

births = dict(map(lambda i: [i, sum(int(elem[4]) for elem in l if elem[3] == str(i))], range(1,8)))

答案 3 :(得分:0)

如果您需要 1-liner

from itertools import islice

lst = [['year', 'month', 'date_of_month', 'day_of_week', 'births'], 
       ['1994', '1', '1', '6', '8096'], 
       ['1994', '1', '2', '7', '7772'], 
       ['1994', '1', '3', '1', '10142']]

print({sublst[3]: sublst[4] for sublst in islice(lst, 1, None)})
# {'6': '8096', '7': '7772', '1': '10142'}

这会遍历lst跳过第一个子列表的所有元素,每次都会提取day_of_weekbirths

对于跳过,itertools.islice是合适的。

或者,只需切片lst[1:]就可以了。感谢@kabanus

lst = [['year', 'month', 'date_of_month', 'day_of_week', 'births'], 
       ['1994', '1', '1', '6', '8096'], 
       ['1994', '1', '2', '7', '7772'], 
       ['1994', '1', '3', '1', '10142']]

print({sublst[3]: sublst[4] for sublst in lst[1:]})
# {'6': '8096', '7': '7772', '1': '10142'}