【问题标题】:Appending associative arrays in Python在 Python 中附加关联数组
【发布时间】:2011-07-19 22:12:47
【问题描述】:

我最近一直在寻找解决方案,但到目前为止无济于事。我从 php 到 python,遇到了一个关联数组的差异,我现在不确定要克服。

走这条线:

data[user]={i:{'item':row[0],'time':row[1]}}

这会覆盖我的每个 data[user] 条目,显然,因为它不是附加的,它只是每次都替换数据。

在 php 中,如果我想在 for 循环中添加一些新数据,我可以这样做

data[user][i][]=array('item'=>'x','time'=>'y'); // crude example

在python中,我做不到:

data[user][]={i:{'item':row[0],'time':row[1]}}

它在我的[] 上呕吐

我也做不到:

data[user][i]={'item':row[0],'time':row[1]}

我是循环中的迭代器...我认为这是因为 data[user] 尚未定义,但在操作时?我已经创建了data={},但我还没有将用户作为键填充。

在python中,是否必须先定义一个键才能定义它,包括子键?

我尝试了一堆.append() 选项和其他奇怪的技巧,但我想知道这样做的正确方法。

可以做:

data[user,i]={'item':row[0],'time':row[1]}

但这不是我想要的。

python 朋友,我这里的正确方法是什么?

【问题讨论】:

  • 好吧,看来我并没有我希望的那么清楚。问题不在于添加 data[user]=stuff。问题是添加 data[user][i]=stuff

标签: python list dictionary append


【解决方案1】:

如果data[user] 是一个列表,您可以使用data[user].append({'item':row[0],'time':row[1]}) 附加到它。

【讨论】:

    【解决方案2】:
    import collections
    
    data = collections.defaultdict(list)
    for user,row,time in input:
        data[user].append({'row':row, 'time':time})
    

    【讨论】:

    • defaultdict 是您可以使用的方法。我没有使用它,因为 OP 可能处于无法使用的情况(例如,如果 data 由其他库模块提供)
    • @Zack 您可以将 defaultdict 与任何类一起使用,只要它可以使用 0 个参数进行实例化,即使没有,您也可以使用 functools.partial 预先提供实例化参数。愚蠢的例子:defaultdict(partial(raw_input, "initial_string? "))
    • @lazyr 我想你误解了 - 想象 存储在变量 data 中的对象的构造不受 OP 的控制,所以他们被卡住了无论它有什么类型。例如,如果data = shelve.open(...) 怎么办?
    【解决方案3】:

    这样的事情应该可以工作。请注意,与 PHP 不同,Python 为数值数组(称为“列表”)和关联数组(称为“字典”或“字典”)提供了不同的原始类型。

    if user not in data:
        data[user] = []
    data[user].append({'item': row[0], 'time': row[1]})
    

    【讨论】:

    • 这就是我要找的。 .append({})
    • 除了不要将列表称为“数组”,因为还有array.array
    • @Wooble 好点,已更正。我还不需要那个,所以我忘记了它的存在。
    【解决方案4】:

    您也可以使用setdefault() 并执行以下操作:

    userData = data.setdefault(user, {})
    userData[i] = {'item': row[0], 'time': row[1]}
    

    【讨论】:

    • 也很有趣。谢谢你。 =D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多