Я имею дело с этапом предварительной обработки таблицы данных. Мой текущий код работает, но мне интересно, есть ли более эффективный способ.Есть ли более эффективный способ написать этот код Python?
Моя таблица данных выглядит следующим образом
object A object B features of A features of B
aaa w 1 0
aaa q 1 1
bbb x 0 0
ccc w 1 0
для X было бы
[ (aaa, aaa, bbb, ccc), (w, q, x, w), (1, 1, 0, 1), (0, 1, 0, 0)]
Сейчас я пишу код, чтобы сделать таблицу, которая включает в себя все комбинации всех возможных матча объект A & объект B (повторите комбинацию объекта A & объекта B без повторения), в то время как A & B сохраняет свои функции соответственно. Таблица будет выглядеть следующим образом: (строки со звездой являются добавленные строки)
object A object B features of A features of B
aaa w 1 0
aaa q 1 1
* aaa x 1 0
---------------------------------------------------------
bbb x 0 0
* bbb w 0 0
* bbb q 0 1
---------------------------------------------------------
ccc w 1 0
* ccc x 1 0
* ccc q 1 1
Все данные по имени X Чтобы получить таблицу: Мой код выглядит следующим образом, но она работает очень медленно:
-----------------------------------------
#This part is still fast
#to make the combination of object A and object B with no repetition
def uprod(*seqs):
def inner(i):
if i == n:
yield tuple(result)
return
for elt in sets[i] - seen:
seen.add(elt)
result[i] = elt
for t in inner(i+1):
yield t
seen.remove(elt)
sets = [set(seq) for seq in seqs]
n = len(sets)
seen = set()
result = [None] * n
for t in inner(0):
yield t
#add all possibility into a new list named "new_data"
new_data = list(uprod(X[0],X[1]))
X_8v = X[:]
y_8v = y[:]
-----------------------------------------
#if the current X_8v(content equals to X) does not have the match of object A and object B
#in the list "new_data"
#append a new row to the current X_8v
#Now this part is super slow, I think because I iterate a lot
for i, j in list(enumerate(X_8v[0])):
for k, w in list(enumerate(X_8v[1])):
if (X_8v[0][i], X_8v[1][k]) not in new_data:
X_8v[0] + (X_8v[0][i],)
X_8v[1] + (X_8v[1][k],)
X_8v[2] + (X_8v[2][i],)
X_8v[3] + (X_8v[3][k],)
X_8v[4] + (X_8v[4][i],)
X_8v[5] + (0,)
X_8v[6] + (0,)
y_8v.append(0)
Есть ли какие-либо улучшения для кода выше?
Большое спасибо!
@ Loïc даже не. –
Это было бы намного проще с примером того, как выглядит структура данных (т. Е. 'X = ...'). – smarx
Я запустил OP: http://pastebin.com/Acu5ZQND –