【问题标题】: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]
  • 这似乎是许多编程语言中最常见的初学者错误之一,每次都通过循环而不是之前初始化收集变量。我希望我能理解导致它的想法,以及如何改进编程教育以避免它。

标签: python pandas dictionary for-loop


【解决方案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 
    

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 2014-07-06
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2019-06-14
      • 2017-05-30
      • 2016-12-12
      相关资源
      最近更新 更多