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']]