字典中的元组

Posted

技术标签:

【中文标题】字典中的元组【英文标题】:Tuples in Dicts 【发布时间】:2010-12-19 14:09:30 【问题描述】:

是否可以在 python 中将元组作为值添加到字典中? 如果是,那么我们如何添加新值呢?我们如何删除和更改它?

【问题讨论】:

向字典添加新值?向添加新值?是哪个? 【参考方案1】:
>>> a = 'tuple': (23, 32)
>>> a
'tuple': (23, 32)
>>> a['tuple'] = (42, 24)
>>> a
'tuple': (42, 24)
>>> del a['tuple']
>>> a

如果您打算使用元组作为键,您可以这样做:

>>> b = (23, 32): 'tuple as key'
>>> b
(23, 32): 'tuple as key'
>>> b[23, 32] = 42
>>> b
(23, 32): 42

一般来说,字典中的元组并没有什么特别之处,它们一直表现为元组。

【讨论】:

【参考方案2】:

由于元组是不可变的,因此您不能向元组添加值。你可以做的是从当前元组和一个额外的值构造一个新的元组。 += 运算符会为您执行此操作,前提是左侧参数是变量(或者在本例中为字典值):

>>> t = 'k': (1, 2)
>>> t['k'] += (3,)
>>> t
'k': (1, 2, 3)

无论如何,如果您打算更改元组值,存储列表可能会更好吗?这些是可变的。

编辑:既然你updated你的问题,请注意以下几点:

>>> d = 42: ('name', 'date')
>>> d[42][0] = 'name2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

发生这种情况是因为,如前所述,元组是不可变的。你不能改变它们。如果你想改变它们,那么事实上你必须创建一个新的。因此:

>>> d[42] = ('name2', d[42][2])
>>> d
42: ('name2', 'date')

附带说明,您可能需要使用namedtuples。它们的工作方式与常规元组类似,但允许您按名称引用元组中的元素:

>>> from collections import namedtuple
>>> Person = namedtuple('Person', 'name date')
>>> t = 42: Person('name', 'date')
>>> t[42] = Person('name2', t[42].date)
>>> t
42: Person(name='name2', date='date')

  :下次请编辑您的实际问题。 请勿发布仅包含更多问题的答案。这不是论坛。

【讨论】:

【参考方案3】:

您不能更改元组本身。您必须用不同的元组替换它。

当你使用一个列表时,你也可以给它添加值(改变列表本身)而不需要替换它:

>> a = 'list': (23, 32)
>> a
'list': [23, 32]
>> a['list'].append(99)
>> a
'list': [23, 32, 99]

在大多数情况下,列表可以用作元组的替代品(因为据我所知,它们支持所有元组函数——这是鸭子打字,伙计!)

【讨论】:

你似乎遗漏了一些部分 @SilentGhost:别害羞,告诉我!顺便说一句:我不打算给出完整的答案,因为你已经给出了一些很好的建议。我只想添加有关列表的信息。【参考方案4】:
t1=('name','date')
t2=('x','y')

# "Number" is a String key!
d1="Number":t1
# Update the value of "Number"
d1["Number"] = t2

# Use a tuple as key, and another tuple as value
d1[t1] = t2

# Obtain values (getters)

# Can throw a KeyError if "Number" not a key
foo = d1["Number"]

# Does not throw a key error, t1 is the value if "Number" is not in the dict
d1.get("Number", t1)

# t3 now is the same as t1
t3 = d1[ ('name', 'date') ]

您再次更新了您的问题。请查看Python dict docs。 Python 文档是它的强项之一!并在命令行上使用解释器(python)!但让我们继续吧。

    初始键 0

    d[0] = ('name', datetime.now())

    ID 已知 d1 = d[0] 删除[0]

    名称已更改 tmp = d1 d1 = (新名称, tmp1)

请考虑使用

class Person(object):
    personIdCounter = 1
    def __init__(self):
      self.id = Person.personIdCounter
      Person.personIdCounter += 1
      self.name
      self.date

然后

persons = 
person = Person()
persons[person.id] = person
person.name = "something"

persons[1].name = "something else"

这看起来比元组更好,并且可以更好地为您的数据建模。

【讨论】:

非常感谢!但是你知道......我是python的初学者......而且我并没有真正“得到”你的答案!我更喜欢在 python 的第一步中以简单的方式做到这一点;(我觉得很傻......但是......:( 我想通了。这是您可以在 Python 命令行上键入的所有内容,供您使用。 Person 类向您展示了一种更结构化的替代方法来解决此类问题。

以上是关于字典中的元组的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的元组中的第一个值总是未知的?

对本身位于元组中的元组(可迭代的可迭代)求和的最有效方法是啥?

通过索引获取元组中的元组值

我的元组中的那些小“u”是啥? (python 2.7)[重复]

如何更新存储在 ets 表中的元组中的数字?

Python中的元组(Tuple)