您好我是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 和价值是当天的总出生人数。
答案 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_week
和births
。
对于跳过,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'}