gpt4 book ai didi

python - 在 For 循环中创建字典时防止覆盖嵌套字典值

转载 作者:行者123 更新时间:2023-11-29 18:37:07 25 4
gpt4 key购买 nike

我对 Python 非常陌生,正在尝试编写一个脚本来循环现有字典并重新组织数据,使其位于嵌套字典中。现有的字典是根据我在网上找到的一些代码创建的,该代码将 SQL 查询中的一行转换为字典。我知道这有点多余,我只是不知道如何编辑这段代码以使其显示我想要的内容。

这是脚本:https://geert.vanderkelen.org/2010/fetching-rows-as-dictionaries-with-mysql-connectorpython/

无论如何,当我这样做时,即使嵌套字典的字典键正在更改,嵌套字典也会自动覆盖以前的嵌套字典。我搜索并发现了其他一些具有相同问题的 StackOverflow 问题,但未能找到适合我的代码的解决方案。

这是我的相关代码:

    row=curs.fetchone
d={}
D={}
while row is not None:
station=row[u'STATION']
date_obs=row[u'DATE_OBSERVATION']
temperature=row[u'TMPC']
altimeter=row[u'ALTM']
dewpoint=row[u'DWPC']
windspeed=row[u'SPED']
winddirection=row[u'DRCT']
for i in ('date_obs', 'temperature', 'altimeter', 'dewpoint', 'windspeed', 'winddirection'):
d[i]=locals()[i]
D[station]=d
row = curs.fetchone()
print D

我会得到这样的东西(尽管有更多的字典条目):

{u'KBFI': {date_obs': datetime.datetime(2017, 7, 19, 16, 56), 'temperature': Decimal('21.00' 'dewpoint: 'Decimal('4.00'), 'altimeter': Decimal('30.10'), 'windspeed': Decimal('3.00'), 'winddirection': Decimal('310.00')}, u'KKLS': {date_obs': datetime.datetime(2017, 7, 19, 16, 56), 'temperature': Decimal('21.00' 'dewpoint: 'Decimal('4.00'), 'altimeter': Decimal('30.10'), 'windspeed': Decimal('3.00'), 'winddirection': Decimal('310.00')}}

并且想要类似的东西:

{u'KBFI': {date_obs': datetime.datetime(2017, 7, 19, 16, 53), 'temperature': Decimal('19.00' 'dewpoint: 'Decimal('5.00'), 'altimeter': Decimal('30.06'), 'windspeed': Decimal('4.00'), 'winddirection': Decimal('270.00')}, u'KKLS': {date_obs': datetime.datetime(2017, 7, 19, 16, 56), 'temperature': Decimal('21.00' 'dewpoint: 'Decimal('4.00'), 'altimeter': Decimal('30.10'), 'windspeed': Decimal('3.00'), 'winddirection': Decimal('310.00')}}

最佳答案

您创建一个 d 字典:

d = {}

然后,在每个循环中,您在主 D 字典中创建一个新条目:

D[station] = d

但每次,d 都指的是同一个字典。您已使用 d[i] = .... 在每个循环中更新了其值,但它仍然保持相同的对象。

因此,当您打印 D 时,D['KBFI']D['KKLS'] 引用同一个字典对象,其值是您在上一个循环中给出的值。

用 Python 的说法,我们说 dict 对象是可变的:您可以更改它们包含的内容,而无需创建新对象。

为了获得您想要的行为,您可以在每个循环中创建一个新的 d:

while row is not None:
station = row[u'STATION']
# ....
d = {} # Here, we create a new dict
for i in ('date_obs', 'temperature', 'altimeter', 'dewpoint', 'windspeed', 'winddirection'):
d[i] = locals()[i]
D[station] = d # D[station] now refers to our new dict

但是这个使用 locals() 的 hack 真的很难看......你宁愿使用:

D={}

row = curs.fetchone
while row is not None:
station = row[u'STATION']
D[station] = {'date_obs': row[u'DATE_OBSERVATION'],
'temperature': row[u'TMPC'],
'altimeter': row[u'ALTM'],
'dewpoint': row[u'DWPC'],
'windspeed': row[u'SPED'],
'winddirection': row[u'DRCT']
}
row = curs.fetchone()
print D

或者您可以保留键名称和字段名称之间的对应表,并将代码重写为:

fields = {'date_obs': u'DATE_OBSERVATION', 'temperature': u'TMPC'} # and so on...

D={}
row = curs.fetchone
while row is not None:
station = row[u'STATION']
D[station] = { key: row[field] for key, field in fields.items() }
row = curs.fetchone()
print D

使用字典理解。

关于python - 在 For 循环中创建字典时防止覆盖嵌套字典值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45200608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com