13

是否可以在 python 中将元组添加为字典中的值?
如果是,那么我们如何添加新值呢?我们怎样才能删除和改变它?

4

4 回答 4

28
>>> 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}

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

于 2009-11-23T18:15:00.477 回答
7

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

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

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

编辑:由于您更新了问题,请注意以下事项:

>>> 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')}

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

于 2009-11-23T18:19:10.920 回答
2

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

当您使用列表时,您还可以向它添加值(更改列表本身)而无需替换它:

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

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

于 2009-11-23T18:18:47.830 回答
1
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 文档。Python 文档是它的强项之一!并在命令行上使用解释器(python)!但让我们继续。

  1. 初始键 0

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

  2. id 已知 d 1 = d[0] del d[0]

  3. 名称已更改 tmp = d 1 d 1 = ( newname, tmp 1 )

请考虑使用

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"

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

于 2009-11-23T18:55:26.977 回答