替换嵌套列表中某些列表中的值

时间:2017-12-02 08:07:26

标签: python list nested-lists

我正在为蜡笔制造商编写一个程序。它们有4个库存(现在因为它是调试的良好起点)。我已在列表中显示:

function SortByActionPriority($a, $b) {
    return $a[priority] > $b[priority] ? 1 : -1;
}

我想改变两个包装中蜡笔的颜色,绿色在中间,以获得更多种颜色的包装。 首先,我发现中间的所有包装都是绿色的:

colors=[['pink','green','blue'],['blue','green','red'],['pink',blue','yellow'],['orange','pink','yellow']]

然后我删除了我从库存(颜色)中选择的包装,以便可以修改它们并稍后放回。

packsfound = []

for pack in colors:
 if pack[1]=="green":
     packsfound.append(pack)

print("packs with one:",packsfound)

然后我做了替换:

try:
 for pack in packsfound:
  colors.remove(pack)
except Exception as e:
  print(e)
  pass 

然后我将修改后的列表追溯到颜色,这样它们就是新的库存

for pack in packsfound:
try:
 for i, color in enumerate(packsfound):
     position=color.index("green")
     print("replace at:",position)
     break

 pack[position]="yellow"
 print("replaced rows:",packsfound)
except Exception as e:
 print(e)
 pass 

问题是它只通过第一个列表并替换第一个绿色。然后程序说绿色不在列表中并且不替换第二个绿色:

try:
 for pack in packsfound:        
  colors.append(pack)
except Exception as e:
  print(e)
  pass

print(colors)

我尝试过很多东西,例如移动try和except,以及将替换线移入和移出循环,添加break和pass但是没有任何效果。

3 个答案:

答案 0 :(得分:1)

替换循环有错误。放置break语句的方式只允许循环的一次迭代。你可以使用这个循环:

for pack in packsfound:
    try:
        position = pack.index('green')
        print("replace at:",position)
        pack[position]="yellow"
        print("replaced rows:",packsfound)
except Exception as e:
        print(e)
        pass 

答案 1 :(得分:0)

不是更改列表中的元素,而是更容易构建新列表并返回该列表。将简单list comprehensionif/else

一起使用
>>> mid = int( len(colors[0])/2 )
>>> [ color[:mid]+['yellow']+color[mid+1:] if color[mid]=='green' else color for color in colors ]
=> [['pink', 'yellow', 'blue'], ['blue', 'yellow', 'red'], ['pink', 'blue', 'yellow'], ['orange', 'pink', 'yellow']]

请注意OP: 这是考虑您只想将green中的middle颜色替换为yellow 。否则,所有“绿色”元素都需要替换为yellow,请使用替换。

OP的注意事项: 这是单集中奇数个颜色的情况。否则,偶数的中间是两个元素,因此相应地更改代码。

答案 2 :(得分:0)

我相信您的替换步骤就是问题所在。当您尝试枚举嵌套列表时,您似乎犯了一个错误。我不确定当您使用.index()获取您正在搜索的颜色值的索引时,为什么要尝试枚举列表。

packsfound = [['pink', 'green', 'blue'], ['blue', 'green', 'red']]

for pack in packsfound:
  try:
    for color in pack:
      position = pack.index('green')
      print("replace at: ", position)
      break
    pack[position] = 'yellow'
    print("replaced rows: ", packsfound)
  except Exception as e:
    print(e)
    pass

请原谅我对变量名称的更改。这输出:

replace at:  1
replaced rows:  [['pink', 'yellow', 'blue'], ['blue', 'green', 'red']]
replace at:  1
replaced rows:  [['pink', 'yellow', 'blue'], ['blue', 'yellow', 'red']]