Python - как отсортировать и заменить значения в массиве на основе словаря - PullRequest
0 голосов
/ 16 апреля 2020

Я создал массив, который извлекал данные из разных файлов и вставлял их в массив. Эти данные имеют различное количество значений 1-7 и порядок.
т.е. один файл может иметь 3 строки

label1
label4
label3

, следующий файл может иметь только

label3

и еще один может иметь

label7
label1
label3
label2

Я создал словарь

Dict = {1:'label1',
        2:'label2',
        3:'label3',
        4:'label4',
        5:'label5',
        6:'label6',
        7:'label7'}

Я хочу

  1. l oop через массив
  2. установить для каждой метки значение словаря (т.е. если label4, то оно = 4)
  3. упорядочить его в порядке 1-7
  4. для пропущенных значений, поставить 0 в этом месте
  5. для пятен со значениями, поставьте 1 в этом месте

т.е. для [label1,label4,label3]

  1. замените словарным значением и сортируйте - [1,3,4]
  2. l oop через массив, и если это число отсутствует, поставьте 0 в этом месте, все остальное превратится в 1 в том же месте, где оно было - [1,0,1,1,0,0,0]

По сути, я его горячо кодирую.

Это то, что я пытаюсь, но я путаю л oop logi c где-то:

y_temp = []
for j in y:
    for k in y[j]:
        if y[j,k]== Dict[1]:
            y_temp[k] = y_temp[k].append('1')
            else:
                y[k] = y_temp[k].append('0')
        elif y[j,k] == Dict[2]:
            y_temp[k] = y_temp[k].append('2')
            else:
                y[k] = y_temp[k].append('0')
        elif y[j,k] == Dict[3]:
            y_temp[k] = y_temp[k].append('3')
            else:
                y[k] = y_temp[k].append('0')
        elif y[j,k] == Dict[4]:
            y_temp[k] = y_temp[k].append('4')
            else:
                y[k] = y_temp[k].append('0')
        elif y[j,k] == Dict[5]:
            y_temp[k] = y_temp[k].append('5')
            else:
                y[k] = y_temp[k].append('0')
        elif y[j,k] == Dict[6]:
            y_temp[k] = y_temp[k].append('6')
            else:
                y[k] = y_temp[k].append('0')
        elif y[j,k] == Dict[7]:
            y_temp[k] = y_temp[k].append('7')
            else:
                y[k] = y_temp[k].append('0')

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Вы должны построить свой словарь наоборот (т.е. ключи должны быть метками). Это позволит вам конвертировать метки в индексы.
Чтобы получить окончательный список из 1 и 0, вам не нужно go выполнять промежуточный шаг со списком индексов, вы можете построить этот список непосредственно из Исходные данные:

Dict = {'label1':1,
        'label2':2,
        'label3':3,
        'label4':4,
        'label5':5,
        'label6':6,
        'label7':7}


lines1 = """label1
label4
label3""".split("\n")

lines2 = """label3
label1""".split("\n")

lbl = [lines1,lines2] # <-- this is a list of lists (of strings) like yours

result = [0]+[0]*max(Dict.values())
for lineList in lbl:
    for line in lineList:
        result[Dict.get(line,0)] = 1 # <-- notice how this is using line, not lbl
result = result[1:]

print(result)
# [1, 0, 1, 1, 0, 0, 0]
0 голосов
/ 17 апреля 2020

Было немного не совсем верно в каждой версии решения. Я закончил создание решения, которое объединило некоторые компоненты обоих. Спасибо вам обоим @Alain T и @Phineas за ваши замечательные решения и ответы на мои вопросы. Я бы не справился без вас. Спасибо !!

Dict = {'label1': 0,
        'label2': 1,
        'label3': 2,
        'label4': 3,
        'label5': 4,
        'label6': 5,
        'label7': 6}

labels_arr = [['label1', 'label5', 'label4'], ['label1', 'label4', 'label3'], 
             ['label1', 'label3'], ['label1'], ['label1', 'label4', 'label3'], 
             ['label1', 'label3', 'label4'], 
             ['label1', 'label2', 'label3', 'label4', 'label5', 'label6', 'label7']]

nums_arr  =[]                      # this array saves the list after each loop
for i in range(len(labels_arr)):   # needed first to loop through the list of lists
    nums_arr_i=[]                  # this array needed to append the 1's and 0's to it
    for key in Dict.keys():        # after we loop through the Dict keys first
        if key in labels_arr[i]:   # compares the keys to original labels array at [i]
            nums_arr_i.append(1)   # append 1 or 0 if it matches or not
        else:
            nums_arr_i.append(0)
    nums_arr.append(nums_arr_i)    # end result list of 7 1's or 0's is appended to 
print('nums_arr= ', nums_arr)      # nums_arr and we loop to the next i in labels_arr

# End Result
nums_arr=  [[1, 0, 0, 1, 1, 0, 0], [1, 0, 1, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0], 
           [1, 0, 0, 0, 0, 0, 0], [1, 0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 0, 0, 0], 
           [1, 1, 1, 1, 1, 1, 1]]
0 голосов
/ 16 апреля 2020

Я согласен с @Alain T., что лучше изменить Dict. Однако, если вы хотите оставить все как есть:

Dict = {1:'label1',2:'label2',3:'label3',4:'label4',5:'label5',6:'label6',7:'label7'}

lables_arr=['label1','label4','label3']        

nums_arr=[]
for x,y in Dict.items():
    for z in lables_arr:
        if z==y:
            nums_arr.append(x)

nums_arr.sort()

final=[]
for i in range(len(Dict)):
    if i not in nums_arr:
        final.append(0)
    else:
        final.append(1)

print(final)

Вывод:

[0, 1, 0, 1, 1, 0, 0]

...