Python 从查找表更改列表的元素
我有一个类似于Python 从查找表更改列表的元素,python,Python,我有一个类似于y\u train=[1 1 1 3 3 4 5 6 6]的列表。我想更改某些元素的值。例如,每1更改一次0,每3更改一次1,每4更改一次2,依此类推。同样重要的是,以前更改的值不应被覆盖。目前,我正在使用For和enumerate for n, i in enumerate(A): if i == 1: y_train[n] = 0 elif i == 3: y_train[n] = 1 elif i == 4:
y\u train=[1 1 1 3 3 4 5 6 6]
的列表。我想更改某些元素的值。例如,每1更改一次0,每3更改一次1,每4更改一次2,依此类推。同样重要的是,以前更改的值不应被覆盖。目前,我正在使用For
和enumerate
for n, i in enumerate(A):
if i == 1:
y_train[n] = 0
elif i == 3:
y_train[n] = 1
elif i == 4:
y_train[n] = 2
elif i == 5:
y_train[n] = 3
elif i == 6:
y_train[n] = 4
else :
y_train[n] = 5
但我需要一种更简洁的pythonic方法来实现这一点,语法类似于y_train lookup[1 3 4]中的每个元素使用[0 1 2]进行更改。我想您正在寻找一种新的方法。它非常适合表示查找表
In [1]: lookup_table = {1:0, 3:1, 4:2}
In [2]: y_train =[ 1, 1, 1, 1, 3, 3, 3, 4, 4, 5, 6, 6, 6]
In [3]: new_y_train = [lookup_table.get(x, x) for x in y_train]
In [4]: new_y_train
Out[4]: [0, 0, 0, 0, 1, 1, 1, 2, 2, 5, 6, 6, 6]
在这里,我使用了
get
方法在查找表没有条目时提供原始值作为回退值,但是如果您确信您的查找表是详尽的,那么这可能不是必需的。您可以根据提供的值构建查找字典。如果你想翻译所有的值,就像我猜想的那样,你只需要获得所有可用值的映射,使用基于y_列中唯一项的dict理解(你可以使用set访问)
我想这符合你的条件
y_train =[ 1, 1, 1, 1, 3, 3, 3, 4,4, 5, 6, 6, 6]
l = list(set(y_train))
y = list()
for i in y_train:
if i in l:
y.append(l.index(i))
else :
y.append(5)
使用
numpy
您应该
import numpy as np
if __name__ == '__main__':
data = np.array([
[1, 'a'],
[1, 'b'],
[1, 'c'],
[2, 'a'],
[2, 'b'],
[2, 'c'],
[3, 'a'],
[3, 'b'],
[3, 'c']
])
print(data)
# [['1' 'a']
# ['1' 'b']
# ['1' 'c']
# ['2' 'a']
# ['2' 'b']
# ['2' 'c']
# ['3' 'a']
# ['3' 'b']
# ['3' 'c']]
col_to_change = data[:, 0].astype('int64')
conditions = [
(col_to_change == 1),
(col_to_change == 2),
(col_to_change == 3)
]
to_ = [10, 20, 30]
final_col = np.select(conditions, to_, default='')
print(final_col)
# ['10' '10' '10' '20' '20' '20' '30' '30' '30']
data[:, 0] = final_col
print(data)
# [['10' 'a']
# ['10' 'b']
# ['10' 'c']
# ['20' 'a']
# ['20' 'b']
# ['20' 'c']
# ['30' 'a']
# ['30' 'b']
# ['30' 'c']]
您是否尝试过使用
dict
?您似乎在进行机器学习,您是否在使用numpy?使用numpy,但如果可能的话,请避免使用python core来实现相同的目标。@colt.exe我给了您一个numpy答案
import numpy as np
if __name__ == '__main__':
data = np.array([
[1, 'a'],
[1, 'b'],
[1, 'c'],
[2, 'a'],
[2, 'b'],
[2, 'c'],
[3, 'a'],
[3, 'b'],
[3, 'c']
])
print(data)
# [['1' 'a']
# ['1' 'b']
# ['1' 'c']
# ['2' 'a']
# ['2' 'b']
# ['2' 'c']
# ['3' 'a']
# ['3' 'b']
# ['3' 'c']]
col_to_change = data[:, 0].astype('int64')
conditions = [
(col_to_change == 1),
(col_to_change == 2),
(col_to_change == 3)
]
to_ = [10, 20, 30]
final_col = np.select(conditions, to_, default='')
print(final_col)
# ['10' '10' '10' '20' '20' '20' '30' '30' '30']
data[:, 0] = final_col
print(data)
# [['10' 'a']
# ['10' 'b']
# ['10' 'c']
# ['20' 'a']
# ['20' 'b']
# ['20' 'c']
# ['30' 'a']
# ['30' 'b']
# ['30' 'c']]