【问题标题】:Changing elements in a tuple converted to list in Python将元组中的元素更改为 Python 中的列表
【发布时间】:2021-11-18 16:09:44
【问题描述】:

在 Python 代码中,我有一个这样的元组列表:

file1 = [[('a', -1), ('b', -1), ('c', -1)], [('a', -1), ('b', -1), ('c', 0)], [('a', -1), ('b', -1), ('c', 1)], [('a', 0), ('b', -1), ('c', 1)]] 

这是一个包含 51 个项目的列表。我必须将所有的 '-1' 更改为 '0',只要我更改它,我就必须为每次更改创建一个新的元组。例如:第一个元组:[('a', -1), ('b', -1), ('c', -1)] 应该生成三个不同的元组,例如: (1) [('a', 0), ('b', -1), ('c', -1)], [('a', -1), ('b', 0), ('c', -1)] and (3) [('a', -1), ('b', -1), ('c', 0)].

我尝试将所有元组转换为列表,但它不起作用。我也试过了

for i in file1:
    i = list(i)
    for j in i:
        j = list(j)
        if j[1] == -1:
            j = (j[0],0)
            file2.append(i) 

如何解决这个问题?它不会改变任何项目。

【问题讨论】:

  • 第二个列表[('a', -1), ('b', -1), ('c', 0)]应该给出[('a', 0), ('b', -1), ('c', 0)][('a', -1), ('b', 0), ('c', 0)]
  • 是的,这个只有两个'-1'值。所以它只给出了两个不同的元组。
  • 您想要一个平面列表中的所有结果吗?或者你想要第一个列表的 3 个结果在他们自己的列表中,第二个列表的两个结果在另一个列表中,等等?
  • 平面列表,这只是一个示例,整个列表有 51 个元组。结果列表应该比这更多。

标签: python list replace tuples


【解决方案1】:

它不会做任何改变,因为每次你追加i。而且您还在迭代子列表项,但实际上并没有将整个新更改的子列表存储在任何地方。相反,当您遍历子列表的项目并遇到 -1 时,创建子列表的副本,在该索引处将值更改为 0 并将这个新副本附加到结果中。

file1 = [[('a', -1), ('b', -1), ('c', -1)], [('a', -1), ('b', -1), ('c', 0)], [('a', -1), ('b', -1), ('c', 1)], [('a', 0), ('b', -1), ('c', 1)]]

file2 = []
for items in file1:
    for i, (_, value) in enumerate(items):
        if value == -1:
            tmp = items.copy()
            tmp[i] = (tmp[i][0], 0)
            file2.append(tmp)

【讨论】:

  • 谢谢!我只需要删除带有“if not idx”的行和以下行。不应将没有“-1”实例的元组添加到 file2。
  • @ChrSld 我已经修改了答案,这也稍微简化了代码。
【解决方案2】:
from copy import deepcopy

# somewhere to save results
file2 = []

# loop the outer list
for inner_list in file1:

  # save the original (or remove, if not needed)
  file2.append(inner_list)

  # loop the individual tuples
  for i, t in enumerate(inner_list):

    # find any -1s
    if t[1] == -1:

      # save the list, again
      file2.append(deepcopy(inner_list))

      # replace the required tuple
      file2[-1][i] = tuple([t[0], 0])
      

【讨论】:

  • 如果它包含任何 -1,我认为 OP 不想附加 inner_list。另外,不需要深拷贝,一个简单的拷贝就足够了。
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2021-11-02
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多