1个列表中的两个操作

时间:2013-03-26 23:29:03

标签: python

我有一个列表清单

w = [['2', '22', '32', '44', '55', '66', '69', '94'], ['22', '24', '49', '74', '90', '113', '130', '140']]

从此必须得到一个新的列表列表,其中: even indices will have 1 subtracted from themall 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']]

任何帮助将不胜感激。

4 个答案:

答案 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。

由于这是在一两个列表构造函数中完成的,所以列表会在迭代时重建。