我可以在python中的列表列表中进行扩展吗?
我有如下数据:我可以在python中的列表列表中进行扩展吗?,python,list,for-loop,extend,Python,List,For Loop,Extend,我有如下数据: [[1, 100313], [2, 100313], [1, 100314], [3, 100315]] [[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]] for x, y in list: if y == 100313: list.extend([0,0,1]) 所有内容都是字符串格式(否则我无法迭代) 我想运行一个for循环,该循环查看这些元素,如果它看到
[[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]]
for x, y in list:
if y == 100313:
list.extend([0,0,1])
所有内容都是字符串格式(否则我无法迭代)
我想运行一个for循环,该循环查看这些元素,如果它看到列表中的第二项为100313,则扩展为[0,0,1]。所以最终看起来是这样的:
[[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]]
for x, y in list:
if y == 100313:
list.extend([0,0,1])
我运行了一个类似以下内容的for循环:
[[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]]
for x, y in list:
if y == 100313:
list.extend([0,0,1])
而且它根本不会改变列表。为什么会这样?您可以使用
列表理解来完成此操作,如以下示例所示:
a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
final = [k+[0,0,1] if k[1] == 100313 else k for k in a]
print(final)
a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
final = [k+[0,0,1] if k[1] == 100313 else k+[0,1,0] if k[1] == 100314 else k for k in a]
print(final)
输出:
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]]
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314, 0, 1, 0], [3, 100315]]
更新:
您要求添加另一个,如果。。。else
在一个列表中阻塞理解
。您可以按照以下示例进行操作:
a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
final = [k+[0,0,1] if k[1] == 100313 else k for k in a]
print(final)
a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
final = [k+[0,0,1] if k[1] == 100313 else k+[0,1,0] if k[1] == 100314 else k for k in a]
print(final)
输出:
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314], [3, 100315]]
[[1, 100313, 0, 0, 1], [2, 100313, 0, 0, 1], [1, 100314, 0, 1, 0], [3, 100315]]
如果您处理大量数据,并且希望避免低效地使用内存,那么最好使用生成器表达式。它们看起来与列表理解非常相似,只是它们没有方括号,而是用括号:
from __future__ import print_function
a = [[1, 100313], [2, 100313], [1, 100314], [3, 100315]]
final = (k+[0,0,1] if k[1] == 100313 else k+[0,1,0] if k[1] == 100314 else k for k in a)
for i in final:
print(i, end='')
print()
生成器表达式返回一个生成器对象,而不是整个列表。通过在返回的生成器中循环,可以逐个惰性地打印元素
请注意,只有当您有非常大的列表并且不喜欢您的问题示例时,这才有意义。在if语句中使用list[x][y]而不是y。并使用list[x]而不是list下一行。这肯定会奏效。
因为你想做的是扩展你的列表,但你真正想要的是扩展列表的元素。希望这有帮助谢谢,如果我也想扩展一个[0,1,0],如果k[1]==100314呢。这一切都可以在一个列表中理解吗?你可以在{100313,100314}@iklinac中使用if k[1],但它是一个不同的扩展…我怎么做呢?你说的不同是什么意思extension@ikliniac对于k[1]==100314,我想添加一个[0,1,0],对于k[1]==100313,我想添加一个[0,0,1],换句话说,我对他们的态度不同,你似乎在浏览外部列表。for循环将内部列表分解为x和y,如果内部列表正好有两个元素。但是当你尝试扩展时,你调用外部列表中的扩展。尝试将循环变量设置为整个内部列表,并在其中检查100313。然后调用内部列表上的extend。