在Python for循环中更改列表中项的值

时间:2012-04-21 20:59:38

标签: python

我创建了一个函数,并且正在向函数传递一个字符串列表,如下所示: ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']

我创建了一个包含26个值的变量X;我在下面的代码中将这些值称为“卡片”(“用于X中的卡片”)。

我正在使用itertools和list comprehensions创建一个字符串列表,以便X中的每个值都替换为新列表中的“XX”。

例如:['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX']将展开为['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc

我正在创建一个名为tmp的值列表,并使用for循环替换tmp(称为'XX')中的一个项目的'X'值列表(称为卡)。

 unitoffive = list(itertools.combinations(unit,5))
 newunit = [list(line) for line in unitoffive if 'XX' in line]


 tmp = [[line,card] for line in newunit for card in X]
 for line in tmp:
     line[0][4] = line.pop(line.index(line[1]))
     print line

  for line in tmp:
     print line

我的剧本表现出我无法理解的行为。当我执行第一个for循环中的打印行语句时,我看到了我期望的修改后的列表。当调用第二个打印行语句时,我看到了另一个不正确的列表版本。我无法返回并使用tmp,因为它似乎只包含修改它的for循环中的正确值。

我知道Python列表在for循环中修改起来很棘手,我尝试将代码更改为循环for line in tmp[:],但这并没有解决我的问题。

此部分代码中的打印行语句按预期打印['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value1'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value2'] etc

for line in tmp:
  line[0][4] = line.pop(line.index(line[1]))
  print line

它后面的打印行语句打印['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'], ['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'value26'] etc

1 个答案:

答案 0 :(得分:1)

您正在更改[line,card]子列表,并期望tmp列表包含它们的副本,而不是相同的对象。尝试更改:

for line in tmp:

有关:

import copy
for line in copy.deepcopy(tmp):

看看它是否按预期工作。

修改

看起来这就是你想要的,要附加到inlist而不是插入:

>>> line = [['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX'], ['value1']]
>>> line[0].append(line.pop()[0])
>>> line
[['CC', 'DC', 'EC', 'FC', 'GC', 'HC', 'XX', 'value1']]
>>>