Python列表替换

时间:2014-04-15 10:05:42

标签: python

意图:在变量集合中,如果任何变量恰好是一个字符串,则拆分为“;”并使其成为一个列表。我尝试使用以下代码,但它无法正常工作。

我期待l2为[“3”,“4”],但它仍然是“3; 4”

请查看它并请详细说明如何循环列表变量并将其替换为

>>> l1 = ["1" ,"2"]
>>> l2 = "3;4"
>>> l3 = ["5", "6"]
>>>
>>> for x in [l1, l2, l3]:
    print("Working on: {}".format(x))
    if isinstance(x, basestring):
        x = x.split(";")
        print("New x: {}".format(x))
    else:
        print("Its same")


Working on: ['1', '2']
Its same
Working on: 3;4
New x: ['3', '4']
Working on: ['5', '6']
Its same
>>> l1, l2, l3
(['1', '2'], '3;4', ['5', '6'])

预期值:

>>> l1, l2, l3
(['1', '2'], ['3', '4'], ['5', '6'])

2 个答案:

答案 0 :(得分:2)

Python中的字符串是不可变的 - 它们不能就地更改。因此:

x = x.split(";")

创建新对象list)并将其分配给名称x,但不会更改列表被迭代。但是,在这种情况下,即使您更改了列表l2仍会引用原始的str对象。

在Python中,名称是对象的引用 - [l1, l2, l3]只是表示第一个索引引用当前由名称l1引用的对象的列表,依此类推。

你可以改为使用这个功能:

def splitter(x):
    print("Working on: {}".format(x))
    if isinstance(x, basestring):
        x = x.split(";")
        print("New x: {}".format(x))
    else:
        print("It's the same")
    return x

然后你可以这样做:

l1 = splitter(l1)
l2 = splitter(l2)
l3 = splitter(l3)

并获得您想要的结果。

或者,将列表解包回名称(这里使用列表解析):

l1, l2, l3 = [splitter(x) for x in [l1, l2, l3]]

(或者,很长一段路)

vals = [l1, l2, l3] # create list
for i, x in enumerate(vals): # iterate through list
    vals[i] = splitter(x) # modify list
l1, l2, l3 = vals # unpack list

答案 1 :(得分:1)

这是因为当您使用for x in lists:时,x是列表项的副本,当您将列表分配回x时,您将其分配给{{1}而不是原始列表。相反,你可以这样做:

x