在 Python 中附加关联数组

Posted

技术标签:

【中文标题】在 Python 中附加关联数组【英文标题】:Appending associative arrays in 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 【参考方案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

以上是关于在 Python 中附加关联数组的主要内容,如果未能解决你的问题,请参考以下文章

在Python中对关联数组进行排序[重复]

5.9 作为关联数组的对象

在javascript / jQuery中对关联数组执行“Diff”操作?

PHP 关联数组等价于 Python dict.get()

shell 脚本-关联数组

shell关联数组