【问题标题】:Swapping objects in tuples - python在元组中交换对象 - python
【发布时间】:2017-10-13 11:38:12
【问题描述】:

我有以下形式的元组:

a[i][j][k]

k ∈ [0,1] a 由包含在列表中的对象 T 组成。

我想要的是交换所有对 a[i][j][0] 和 a[i][j][1] 的位置。所以:

a[i][j][0], a[i][j][1] = a[i][j][1], a[i][j][0]

由于 a 是一个元组,我理解它是不可变的,这就是它不起作用的原因:

for i in range(0, len(teams)-1):
    for j in range(0, len(teams)/2):
        a[i][j][0],a[i][j][1] = a[i][j][1],a[i][j][0]

我尝试将 a 转换为列表 (L = list(a)),但没有成功。

有人可以帮我提些建议吗?抱歉,如果我的命名法还不完美,这是我关于 SO 的第一个问题 :)

谢谢

【问题讨论】:

  • 我们需要看到minimal reproducible example。是a tuple of tuple of tuple?
  • teams 来自哪里?
  • 最外层是元组还是列表?
  • 感谢您的快速回复。下面@Jean-FrançoisFabre 的回答帮助我解决了这个问题。我的矩阵是一个元组列表的列表。我能够将它转移到一个列表的列表中。

标签: python list tuples immutability


【解决方案1】:

假设atupletuples 的tuples。

我愿意

  • 将其转换为列表列表的列表
  • 随心所欲
  • 如果需要,将其转换回原始格式

示例:

a = (((1,2),(3,4)),((10,20),(30,40)))

a_as_list = [[list(x) for x in b] for b in a]

print(a_as_list)

# now manipulate elements:

a_as_list[0][0] = [a_as_list[0][0][1],a_as_list[0][0][0]]

a_as_tuple = tuple(tuple(tuple(x) for x in b) for b in a_as_list)


print(a_as_tuple)

结果:

[[[1, 2], [3, 4]], [[10, 20], [30, 40]]]
(((2, 1), (3, 4)), ((10, 20), (30, 40)))

如您所见,元组被转换为列表,处理,然后转换回元组

编辑:如果a 是您不能执行的元组列表:

a[i][j][0], a[i][j][1] = a[i][j][1], a[i][j][0]

但您可以重新创建内部元组:

a[i][j] = a[i][j][1],a[i][j][0]

【讨论】:

  • 谢谢。这是对我现有报价的快速修复。
  • @MaximilianA.Graves 看到我的编辑,应该够了
  • 完美。我想我必须阅读并了解更多有关列表和元组之间区别的信息。但这已经很有帮助了!
【解决方案2】:

我们可以使用 Python 的 reversed 简单地做到这一点

a[j][k] = tuple(reversed(a[j][k]))

【讨论】:

  • 我也试试这个。这确实看起来更经济。
【解决方案3】:

问题

元组确实是不可变的。 a 可能是一个列表,甚至是一个列表列表。所以这段代码:

L = list(a)

不会改变任何东西。问题似乎是a 是元组列表的列表。 a[i][j] 是一个元组,无法为其分配新值:

>>> t = ('a', 'b')
>>> t[0] = 'b'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

可能的解决方案

如果您正在使用 3-D 矩阵,numpy 可能会对您有所帮助。支持advanced indexing and slicing:

>>> import numpy as np
>>> table = np.arange(18).reshape(3,3,2)
>>> table
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15],
        [16, 17]]])
>>> table[:, :, [0, 1]] = table[:, :, [1, 0]]
>>> table
array([[[ 1,  0],
        [ 3,  2],
        [ 5,  4]],

       [[ 7,  6],
        [ 9,  8],
        [11, 10]],

       [[13, 12],
        [15, 14],
        [17, 16]]])

矩阵中的元素不必是数字,它们可以是任何对象:

>>> class T(str):
...   pass
... 
>>> T('test')
'test'
>>> m = np.array([[(T(1), T(2))],[(T(3), T(4))]])
>>> m[:, :, [0, 1]] = m[:, :, [1, 0]]
>>> m
array([[['2', '1']],

       [['4', '3']]], 
      dtype='<U1')

【讨论】:

  • 非常感谢。我也会和 numpy 一起玩!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
相关资源
最近更新 更多