2014-01-18 3 views
0

Имеется набор данных из двух столбцов: EmployeeCode и Фамилия. Формата как:Независимые массивы мешают друг другу?

EmployeeCode[1] = "L001" 
Surname[1] = "Pollard" 
EmployeeCode[2] = "L002" 
Surname[2] = "Wills" 
... 

То, что я пытался сделать, это сортировать в соответствии с лексикографическим порядком для каждого столбца, чтобы облегчить выполнение бинарного поиска позже.

Это мой код:

#data set 
EmployeeCode, Surname = [0]*33, [0]*33 
EmployeeCode[1] = "L001" 
Surname[1] = "Pollard" 
EmployeeCode[2] = "L002" 
Surname[2] = "Wills" 
EmployeeCode[3] = "L007" 
Surname[3] = "Singh" 
EmployeeCode[4] = "L008" 
Surname[4] = "Yallop" 
EmployeeCode[5] = "L009" 
Surname[5] = "Adams" 
EmployeeCode[6] = "L013" 
Surname[6] = "Davies" 
EmployeeCode[7] = "L014" 
Surname[7] = "Patel" 
EmployeeCode[8] = "L021" 
Surname[8] = "Kelly" 
EmployeeCode[9] = "S001" 
Surname[9] = "Ong" 
EmployeeCode[10] = "S002" 
Surname[10] = "Goh" 
EmployeeCode[11] = "S003" 
Surname[11] = "Ong" 
EmployeeCode[12] = "S004" 
Surname[12] = "Ang" 
EmployeeCode[13] = "S005" 
Surname[13] = "Wong" 
EmployeeCode[14] = "S006" 
Surname[14] = "Teo" 
EmployeeCode[15] = "S007" 
Surname[15] = "Ho" 
EmployeeCode[16] = "S008" 
Surname[16] = "Chong" 
EmployeeCode[17] = "S009" 
Surname[17] = "Low" 
EmployeeCode[18] = "S010" 
Surname[18] = "Sim" 
EmployeeCode[19] = "S011" 
Surname[19] = "Tay" 
EmployeeCode[20] = "S012" 
Surname[20] = "Tay" 
EmployeeCode[21] = "S013" 
Surname[21] = "Chia" 
EmployeeCode[22] = "S014" 
Surname[22] = "Tan" 
EmployeeCode[23] = "S015" 
Surname[23] = "Yeo" 
EmployeeCode[24] = "S016" 
Surname[24] = "Lim" 
EmployeeCode[25] = "S017" 
Surname[25] = "Tan" 
EmployeeCode[26] = "S018" 
Surname[26] = "Ng" 
EmployeeCode[27] = "S018" 
Surname[27] = "Lim" 
EmployeeCode[28] = "S019" 
Surname[28] = "Toh" 
EmployeeCode[29] = "N011" 
Surname[29] = "Morris" 
EmployeeCode[30] = "N013" 
Surname[30] = "Williams" 
EmployeeCode[31] = "N016" 
Surname[31] = "Chua" 
EmployeeCode[32] = "N023" 
Surname[32] = "Wong" 


#sort based on value of main array 
def bubble_sort(main, second): 
    sort = True 
    passed = len(main)-1 
    while sort: 
     sort = False 
     i = 2 
     while i<= passed: 
      #print(main[i],main[i-1],i) 
      if main[i] < main[i-1]: 
       main[i], main[i-1] = main[i-1], main[i] 
       second[i], second[i-1] = second[i-1], second[i] 
       sort = True 
      i += 1 
     passed -= 1 
    return main,second 



#main 
#prepare sorted array for binary search 
#for search by surname, sort according to surname 
sName,sCode = bubble_sort(Surname,EmployeeCode) 


print("**BEFORE******") 
for k in range(0,33): 
    print(sName[k],sCode[k]) 
print("*BEFORE*******") 

#for search by ECode, sort according to ECode 
cCode,cName = bubble_sort(EmployeeCode, Surname) 


print("**AFTER******") 
for k in range(0,33): 
    print(sName[k],sCode[k]) 
print("**AFTER******") 

Однако после сортировки второй раз, то первое время сортировки результата в зЫате и SCODE просто изменили сами по себе. Я никогда не менял вручную.

ДО (первая сортировка)

**BEFORE****** 
0 0 
Adams L009 
Ang S004 
Chia S013 
Chong S008 
Chua N016 
Davies L013 
Goh S002 
Ho S007 
Kelly L021 
Lim S016 
Lim S018 
Low S009 
Morris N011 
Ng S018 
Ong S001 
Ong S003 
Patel L014 
Pollard L001 
Sim S010 
Singh L007 
Tan S014 
Tan S017 
Tay S011 
Tay S012 
Teo S006 
Toh S019 
Williams N013 
Wills L002 
Wong S005 
Wong N023 
Yallop L008 
Yeo S015 
*BEFORE******* 

ПОСЛЕ (второй сортировки см последние 4 пункта)

**AFTER****** 
0 0 
Pollard L001 
Wills L002 
Singh L007 
Yallop L008 
Adams L009 
Davies L013 
Patel L014 
Kelly L021 
Morris N011 
Williams N013 
Chua N016 
Wong N023 
Ong S001 
Goh S002 
Ong S003 
Ang S004 
Wong S005 
Teo S006 
Ho S007 
Chong S008 
Low S009 
Sim S010 
Tay S011 
Tay S012 
Chia S013 
Tan S014 
Yeo S015 
Lim S016 
Tan S017 
Lim S018 
Ng S018 
Toh S019 

Может кто-нибудь сказать мне, как это могло бы произошло?

+0

Каковы ваши объекты «EmployeeCode» и «Surname»? – mhlester

+0

Почему бы просто не использовать встроенный 'sort'? –

ответ

1

Передача и передача аргументов в Python никогда не создадут копии объектов. Когда вы перебираете свои списки, списки, которые вы передаете в сортировку пузырьков, - это те же самые точные объекты списка в памяти, что и списки, по которым происходит сортировка пузырьков. Surname, sName и cName - это те же самые объекты, и когда вы делаете второй сортимент пузыря, вы изменяете sName и sCode вместо создания независимых отсортированных списков.

Если вы хотите скопировать список, вы должны сделать это явно. Это мелкая копия:

new_list = original[:] 

new_list будет новый список, содержащий те же объекты, содержащиеся original.

Это глубокая копия:

import copy 
new_list = copy.deepcopy(original) 

new_list будет новый список, содержащий глубокие копии объектов original содержащихся. (Это иногда также , например, если у вас есть список списков, иногда вы не хотите копировать объекты во внутренних списках.)

Наконец, я хотел бы отметить, что ваш код инициализации является больно подробным. Вы можете использовать литерал списка вместо создания списка с нулями и назначения каждого элемента отдельно:

EmployeeCode = [ 
    'Pollard', 
    'Wills', 
    ... 
] 
Смежные вопросы