迭代器超过列表并更改值

时间:2015-12-10 12:01:36

标签: python list python-2.6

我试图循环变量列表并根据需要对它们进行更改。有人可以帮忙解决这个问题吗?当我第二次打印时,列表不变。我希望bc分别为{'lol'} {'test'}。我试图这样做,而不是为值创建新列表,而是修改原始变量。

a = 'a,b'
b = 'lol'
c = 'Test'
d = None

print a, b, c, d

f = lambda x: '{' + x + '}' if ',' not in x else x

for i in [a, b, c, d]:
    if i:
        i = f(i)

print a, b, c, d

更新

def do_work(self, args):
    if args.a:
        if ',' not in args.a:
            args.a = '{' + args.a + '}'

    if args.b:
        if ',' not in args.b:
            args.b = '{' + args.b + '}'

    self.do_more_work(args)

2 个答案:

答案 0 :(得分:3)

map你的lambda函数,map遍历列表并为生成新列表的每个元素应用一个函数:

a = 'a,b'
b = 'lol'
c = 'Test'
d = None

print(a, b, c, d)

f = lambda x: '{' + x + '}' if x and ',' not in x else x

my_list = [a, b, c, d]
my_list = map(f, my_list)

print (my_list)

修改

如果您需要更改原始值(如注释),您可以解压缩它们:

a, b, c, d = my_list = map(f, my_list)
print(my_list)
print(a)
print(b)
print(c)
print(d)

['a,b', '{lol}', '{Test}', None]
a,b
{lol}
{Test}

答案 1 :(得分:2)

您没有在列表中应用任何更改。实际上在以下行中:

i = f(i)

i只是一个丢弃变量而且并不指向您的列表项。 通过重新分配它,你只需将它改变一下,直到下一次迭代。

如果要更改需要通过索引访问它们的列表项,可以将列表放在变量中并循环遍历列表对象,然后通过索引更改项。为此目的,您可以使用enumerate,如下所示:

a = 'a,b'
b = 'lol'
c = 'Test'
d = None

print(a, b, c, d)

f = lambda x: '{' + x + '}' if ',' not in x else x

my_list = [a, b, c, d]
for i,j in enumerate(my_list):
    if j:
        my_list[i] = f(j)

print (my_list)

或者作为一种更加pythonic的方式,你可以使用列表理解:

my_list = ([f(i) if i else i for i in my_list])