用循环附加到字典
Posted
技术标签:
【中文标题】用循环附加到字典【英文标题】:Appending to dictionary with loop 【发布时间】:2018-12-01 02:08:09 【问题描述】:我想创建一个具有预定列表的字典,但是,我似乎无法弄清楚如何避免覆盖而不是追加,而且我不确定是否可以避免导入任何其他模块。
范围是我有一个包含 1 列字符名称的数据框,其中 ID 号附加到从读取的 excel 文件sega_df
中的名称上:
Character
0 Amy (335)
1 Tails (359)
2 Shadow (357)
3 Shadow (357)
4 Blaze (337)
然后我有一个所有字符的列表,characters
,没有他们的 ID 号:
['Sonic', 'Knuckles', 'Tails', 'Amy', 'Cream', 'Shadow', 'Rouge', 'Silver', 'Blaze']
我想创建一个字典,这样我就可以通过用characters
中字符的len()
分割每一行条目来替换sega_df.Character
,从而产生desired_sega_df
:
Character
0 Amy
1 Tails
2 Shadow
3 Shadow
4 Blaze
我要创建的字典将包含不带 ID 号的字符名称键和名称的 len()
值。字典是slice
:
'Sonic': 5,
'Knuckles': 8,
'Tails': 5,
'Amy': 3,
'Cream': 5,
'Shadow': 6,
'Rouge': 5,
'Silver': 6,
'Blaze': 5
即使我使用.update()
,它仍然会反复覆盖,仅以Blaze
作为键,5
作为值。
>>> for character in characters:
... slice = character: len(character)
... slice.update(character:len(character))
...
>>> slice
'Blaze': 5
我的问题是:如何修改循环以将所有字符的键值对添加到 slice
,而不是不断地覆盖它们?
【问题讨论】:
只是将slice =
移出循环?为什么每次迭代都创建和更新同一个字典?
删除 slice=character:len(character)
并在循环开始之前添加 slice = dict()
您每次都在创建一个新字典。 slice = ...
将一个新的字典对象分配给 slice
。不要那样做。并且不要使用dict.update()
将一个键值对添加到字典中。在循环外创建一个空字典once。在循环中,添加带有slice[character] = len(character)
的键值对。
并不是说您正在做的任何事情都不能通过使用拆分更简单地完成。你的名字都不包含空格,所以你可以使用sega_df['Character'] = sega_df['Character'].str.split().str[0]
这似乎是许多编程语言中最常见的初学者错误之一,每次都通过循环而不是之前初始化收集变量。我希望我能理解导致它的想法,以及如何改进编程教育以避免它。
【参考方案1】:
您应该将slice
定义为循环之外的空字典。按照目前的情况,您在迭代时为每个字符重新定义字典。
【讨论】:
【参考方案2】:将您的代码更新为:
>>> slice = dict()
>>> for character in characters:
... slice.update(character:len(character))
...
【讨论】:
为什么大家总是用dict.update()
来添加一个键值对呢?只需使用slice[character] = len(character)
。
我同意,我们可以同时使用update
和assign
,即使是单个键值对。而且,update
比assign
慢很多,但 OP 使用了更新。为了让他明白,我遵循了同样的风格。【参考方案3】:
这是 Pandorable 的解决方案。对于拆分Character
,您可以选择按空格拆分或按字符数切片。哪种效果最好取决于您的数据集。
无论选择纯 Python 还是 Pandas 解决方案,都不需要使用显式循环。
# remove last 6 characters to leave names
df['Character'] = df['Character'].str[:-6] # or, df['Chracter'].str.split().str[0]
# calculate length in new series
df['Length'] = df['Character'].map(len)
# convert to dictionary
d = df.set_index('Character')['Length'].to_dict()
print(d)
'Amy': 3, 'Tails': 5, 'Shadow': 6, 'Blaze': 5
【讨论】:
感谢 Pandas 的方法。【参考方案4】:characters = ['Sonic',
'Knuckles',
'Tails',
'Amy',
'Cream',
'Shadow',
'Rouge',
'Silver',
'Blaze']
slice =
for character in characters:
slice[character]=len(character)
print(slice)
# TH OUTPUT WILL BE THIS :
# 'Sonic': 5, 'Knuckles': 8, 'Tails': 5, 'Amy': 3, 'Cream': 5, 'Shadow': 6, 'Rouge': 5, 'Silver': 6, 'Blaze': 5
# IF YOU WANT TOI GET THE USER INPUT CHARACTERS JUST USE OTHER
#LOOPS TO HOW MUCH YOU WANT TO GIVE
# THE SOLUTION OF ABOVE QUESTION IS THIS
【讨论】:
以上是关于用循环附加到字典的主要内容,如果未能解决你的问题,请参考以下文章