我可以有条件地更改列表吗?

时间:2019-05-24 21:32:44

标签: python python-3.x list

这可能已经被回答了,但是我在搜索中找不到。

在Python 3中,我发现自己正在编写看起来像这样的代码:

def func():
    for item in list_A:
        if item == 'duck': list_B.append(0)
        elif item == 'goose': list_B.append(1)
        else: list_B.append(item)
    list_A = list_B

我的意图是有条件地更改list_A中的值。例如:

list_A = ['duck', 'duck', 'goose', 'duck', 'chicken']
func(list_A) -> [0, 0, 1, 0, 'chicken']

虽然理想情况下,我想这样做而不创建第二个列表。我想找到类似以下的伪代码:

list_A = [(if item == 'duck': 0, elif item == 'goose': 1, else: item) for item in list_A]

我的直觉是,上面的方法不起作用,因为您无法在遍历列表时对列表进行变异(?),但是如果有人比我的原始方法要好,我将非常有兴趣了解它。谢谢!

4 个答案:

答案 0 :(得分:8)

可以在迭代时替换列表中的元素。问题是结构修改-添加元素,删除元素或导致元素移位的操作。

也就是说,创建第二个列表通常更容易正确,而且通常更快。

如果您仍然想使用变异方法,可以采用以下一种方法:

for i, item in enumerate(l):
     if item == 'duck':
         l[i] = 0
     elif item == 'goose':
         l[i] = 1

答案 1 :(得分:1)

preprocess = make_column_transformer(
    (StandardScaler(),['SPchangeHigh']),
    ( CountVectorizer(),'desc-title')
)
preprocess.fit_transform(features.head(2))

答案 2 :(得分:0)

您可以创建一个字典,然后将其用于映射。在这种情况下,可以在遍历列表时对列表进行变异,因为您是(a)不更改尚未阅读的项目,并且(b)不更改列表的长度。为了使代码更紧凑,可以使用dict.get()来覆盖else情况:

mapping = {'duck': 0, 'goose': 1}
for i, val in enumerate(list_A):
    list_A[i] = mapping.get(val, val)

或者更快,但是更多代码:

mapping = {'duck': 0, 'goose': 1}
for i, val in enumerate(list_A):
    if val in mapping:
        list_A[i] = mapping[val]

如果您可以创建新列表,则可以这样做

mapping = {'duck': 0, 'goose': 1}
list_B = [mapping.get(val, val) for val in list_A]

答案 3 :(得分:0)

def func():
    list_A=['duck','dd']
    list_B=[]   
    dic = {'duck':0,'goose':1}
    for item in list_A:
        list_B.append(dic[item]) if item in dic  else list_B.append(item)

    print(list_B)

print(func())

输出

[0, 'dd']