这可能已经被回答了,但是我在搜索中找不到。
在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]
我的直觉是,上面的方法不起作用,因为您无法在遍历列表时对列表进行变异(?),但是如果有人比我的原始方法要好,我将非常有兴趣了解它。谢谢!
答案 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']