【问题标题】:Enter data in dictionary from two arrays从两个数组在字典中输入数据
【发布时间】:2013-08-01 18:17:18
【问题描述】:

我有以下两个要合并到字典中的数组:

# Input:
wrd = ['i', 'am', 'am', 'the', 'boss', 'the', 'tiger', 'eats', 'rice', 'eats', 'grass']
cnt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Output: 
{
    'i': [0],
    'am': [1,2],
    'the': [3,5],
    'boss': [4],
    'tiger': [6],
    'eats': [7,9],
    'rice': [8],
    'grass': [10]
}

我已经尝试了以下代码,但我认为我的想法是错误的:

    dict={}
    j=0
    for i in wrd:
        if i in dict:
           dict[i].insert(cnt[j])
        else:
           dict[i].append(cnt[j])
           j+=1

    v=dict.values()
    k=dict.keys()
    for k,v in dict.items():
         print k,v

由于我是 python 的新手,我承认我在这里缺乏知识。

【问题讨论】:

  • 您的代码有什么问题?它有任何错误吗?它会给出错误的输出吗?
  • @RohitJain: 错误:dict[i].append(cnt[j])....KeyError: 'i'

标签: python list dictionary merge


【解决方案1】:

为工作使用正确的工具(此处为defaultdict,如 Sukrit Kalra 的回答)始终是最佳解决方案。但了解您的尝试出了什么问题也很有用。

if i in dict:
   dict[i].insert(cnt[j])
else:
   dict[i].append(cnt[j])
   j+=1

如果i 已经在dict 中,那很好:dict[i] 是一个列表,你要调用insert 就可以了。那是行不通的,只是因为insert 需要两个参数——插入对象的索引和要插入的对象。只需将其更改为 append(cnt[j])insert(0, cnt[j]) 或任何合适的。

但如果i 已经在dict 中,那么您正在尝试将append 指向不存在的东西。那显然行不通。您必须先创建一个list 并将其放入dict[i],然后才能对dict[i] 执行任何操作。因此,您可以将该行更改为:

    dict[i] = [cnt[j]]

……这样就解决了。

一旦你理解了这一点,你就可以理解为什么 Sukrit Kalra 的回答如此酷:defaultdict 只是一个dict自动 为任何不是的键创建一个默认值'目前。所以,你可以写dict[i].append(cnt[j]),不管dict[i]是否已经存在,它都可以工作。


顺便说一句,将字典命名为dict 是个坏主意,因为这会隐藏同名的内置类和构造函数。

更一般地说,使用更好的名称总是有帮助的。您使用神秘的缩写和单字母名称保存的击键将被您浪费在调试代码并向需要寻求帮助的人解释的击键所抵消。调用输入类似于wordscounts,外部循环变量wordj 计数器类似于count_index,等等。

同时:cnt 几乎完全没用。对于不超过 10 的任何数字,cnt[j] 只是 j,对于任何超过 10 的数字,它都是 IndexError。为什么不直接使用j

【讨论】:

    【解决方案2】:

    在此处使用collections.defaultdict。看sn-p

    >>> wrd=['i','am','am','the','boss','the','tiger','eats','rice','eats','grass']
    >>> cnt=[0,1,2,3,4,5,6,7,8,9,10]
    >>> from collections import defaultdict
    >>> a = defaultdict(list)
    >>> for key, val in zip(wrd, cnt): # Preferably for val, key in enumerate(wrd):
            a[key].append(val)
    
    
    >>> a
    defaultdict(<type 'list'>, {'grass': [10], 'i': [0], 'am': [1, 2], 'eats': [7, 9], 'boss': [4], 'tiger': [6], 'the': [3, 5], 'rice': [8]})
    >>> a['am']
    [1, 2]
    >>> a['the']
    [3, 5]
    

    【讨论】:

    • 非常感谢您提供简单直接的解决方案。
    【解决方案3】:

    您无需创建计数器列表。 Enumerate 会为你做这件事:

    list(enumerate(['i','am','am','the','boss','the','tiger','eats','rice','eats','grass']))
    #=> [(0, 'i'), (1, 'am'), (2, 'am'), (3, 'the'), (4, 'boss'), (5, 'the'), (6, 'tiger'), (7, 'eats'), (8, 'rice'), (9, 'eats'), (10, 'grass')]
    

    现在,您可以使用 defaultdict 收集它们:

    collect = defaultdict(list)
    for idx, wrd in enumerate(['i','am','am','the','boss','the','tiger','eats','rice','eats','grass']):
        collect[wrd].append(idx)
    

    但是,真正的问题是你为什么需要这个。您打算如何处理这些索引回到原始列表中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 2016-01-10
      • 2018-04-22
      • 1970-01-01
      • 2022-01-10
      • 2022-09-28
      相关资源
      最近更新 更多