我有一个列表清单
w = [['2', '22', '32', '44', '55', '66', '69', '94'], ['22', '24', '49', '74', '90', '113', '130', '140']]
从此必须得到一个新的列表列表,其中:
even indices will have 1 subtracted from them
和all odd indices will have 1 added to them
处的所有元素。所以上面的列表将如下所示:
x = [['1','23','31','45','54','67','68','93'],['21','25','48','75','89','114','129','141']]
任何帮助将不胜感激。
答案 0 :(得分:5)
>>> w = [['2', '22', '32', '44', '55', '66', '69', '94'], ['22', '24', '49', '74', '90', '113', '130', '140']]
>>> [[str(int(s)+(1 if i%2 else -1)) for i, s in enumerate(lst)] for lst in w]
[['1', '23', '31', '45', '54', '67', '68', '95'], ['21', '25', '48', '75', '89', '114', '129', '141']]
答案 1 :(得分:1)
已发布带有列表理解的答案。以下是使用简单for循环的替代方法:
for ls in w:
for i, v in enumerate(ls):
if i % 2:
ls[i] = str(int(v) + 1)
else:
ls[i] = str(int(v) - 1)
答案 2 :(得分:1)
让我们来看看你尝试了什么,以及它有什么问题。使用实时可视化工具可以使这更容易。因此将使用更少的数据。所以,here你可以看到这段代码:
w = [['2', '22'], ['22', '24']]
for i in w:
for k in i % 2 == 0:
x = int(k) - int(1)
首先,for k in i % 2 == 0
做了什么?好吧,i
中的每个w
都是list
,因此i % 2
会提升TypeError
。
这里你想要的是for
循环,里面有if
。这将很难与这些1个字母的名称进行讨论,所以让我们在变量时给出变量更好的名称。所以:
data = [['2', '22'], ['22', '24']]
for sublist in data:
for element in sublist:
if element % 2 == 0:
# even index
else:
# odd index
但这不对,因为规则是索引是偶数,而不是值是偶数。循环时获取索引和值的方法是enumerate
函数。所以:
for sublist in data:
for index, element in enumerate(sublist):
if index % 2 == 0:
# even index
else:
# odd index
同时,只做x = int(k) - int(1)
没有做任何事情;它只是设置了一些立即消失的临时变量。您必须将新值重新放回list
。因此,用:
if index % 2 == 0:
sublist[index] = int(element) - int(1)
else:
sublist[index] = int(element) + int(1)
您可以将整个事物可视化here。一步一步,直到你了解它是如何工作的,你有多接近,以及有什么不同。
如果你不理解为什么sublist[index] = …
有效,但element = …
没有,你可能想要更明确地说明这一点:
for outer_index, sublist in enumerate(data):
for inner_index, element in enumerate(sublist):
...然后设置data[outer_index][inner_index] = …
。
有很多方法可以改善这一点。首先,int(1)
保证与1
相同。另一方面,您可以使用sublist[index] = int(element) + (1 if index % 2 == 0 else -1)
简化整个过程。而且,一旦你有了正确的逻辑,你就可以找到一种方法来实现这一目标 - 建立一个新的列表,而不是就地更改列表,这样就可以打开更多简化的大门,比如把整个循环变成列表理解。
答案 3 :(得分:0)
所以有一种方法:
w = [[str(int(y)+(-1,1)[i%2]) for i,y in enumerate(x)] for x in w]
基本上你只是迭代列表,然后遍历每个列表的元素,根据x%2
(奇数/偶数)添加/减去1。
由于这是在一两个列表构造函数中完成的,所以列表会在迭代时重建。