Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换嵌套列表中特定列表中的值_Python_List_Nested Lists - Fatal编程技术网

Python 替换嵌套列表中特定列表中的值

Python 替换嵌套列表中特定列表中的值,python,list,nested-lists,Python,List,Nested Lists,我正在为一家蜡笔制造商写一个程序。他们有4个包在库存中(目前这是调试的良好起点)。我在一份清单中表明: colors=[['pink','green','blue'],['blue','green','red'],['pink',blue','yellow'],['orange','pink','yellow']] 我想改变两个包中的蜡笔的颜色,其中绿色是在中间,得到更多颜色的包装。 首先,我发现所有中间有绿色的包装: packsfound = [] for pack in colors:

我正在为一家蜡笔制造商写一个程序。他们有4个包在库存中(目前这是调试的良好起点)。我在一份清单中表明:

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)
问题是它只会遍历第一个列表,并替换第一个绿色。然后程序说绿色不在列表中,并且不会取代第二个绿色:

packs with one: [['pink', 'green', 'blue'], ['blue', 'green', 'red']]
replace at: 1
replaced rows: [['pink', 'yellow', 'blue'], ['blue', 'green', 'red']]
'green' is not in list
[['pink', 'blue', 'yellow'], ['orange', 'pink', 'yellow'], ['pink', 'yellow', 'blue'], ['blue', 'green', 'red']]

我尝试过很多方法,比如移动try和except,将替换行移入和移出循环,添加break和pass,但都不起作用。

与其更改列表中的元素,不如创建一个新列表并返回它。使用简单的
列表理解
if/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']]
请注意:这是考虑到您只想将
中间的
中的
颜色替换为
黄色。否则,需要将所有“绿色”元素替换为
黄色
,请使用“替换”


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

替换循环中存在错误。放置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 

我相信你的更换步骤才是问题所在。当您试图枚举嵌套列表时,似乎犯了一个错误。我不知道您为什么要在已经使用
.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']]

嘿。。。与@Toothless相同的响应。打12秒!除息的