【问题标题】:Iterator over list and change values迭代列表并更改值
【发布时间】:2016-03-16 01:24:47
【问题描述】:

我正在尝试遍历变量列表并在需要时对其进行更改。任何人都可以帮助解决这个问题吗?当我第二次打印时,列表没有改变。我期望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)

【问题讨论】:

  • 顺便说一句,您应该避免使用 lambda 和三元运算符来定义 f。它使代码更难阅读并且什么也得不到。使用 if 语句和返回的简单 def f(x): ... 会更好。

标签: python list python-2.6


【解决方案1】:

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}

【讨论】:

  • f(None) 怎么样?您的代码不会处理这种情况。
  • 但是原始值a、b、c和d没有改变。我面临的问题涉及命名参数,我希望将其保留在 argparse 命名空间中,因此我不需要将其余部分取出。在继续程序的其余部分之前
  • 我已经清理了这个问题。抱歉,原始问题不清楚!这行得通,但是当传递给下一个函数时,原始值仍然是相同的
  • @Alan,知道你可能不想创建一个新列表,但我建议让 python 完成他的工作,只需将值解包列表。
【解决方案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)

或者作为一种更 Python 的方式,您可以使用列表推导:

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

【讨论】:

  • 以pythonic方式不需要枚举列表。索引不是必需的。
  • @Dunes 确实,我只是错过了。感谢关注。
  • 我已经清理了这个问题。抱歉,原始问题不清楚!这行得通,但是当传递给下一个函数时,原始值仍然是相同的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
相关资源
最近更新 更多