用循环附加到字典

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) 我同意,我们可以同时使用updateassign,即使是单个键值对。而且,updateassign 慢很多,但 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 

【讨论】:

以上是关于用循环附加到字典的主要内容,如果未能解决你的问题,请参考以下文章

在循环中将字典附加到熊猫数据框

如何在使用while循环时将值附加到字典中的列表?

在将结果附加到字典的 for 循环上使用 python 多处理

从列表的字典中提取列表,然后附加到数据框

For循环正在覆盖列表中的字典值[重复]

将值附加到字典中的一个列表 将值附加到字典中的所有列表