Pythonistas, как я могу переместить данные сверху вниз в слева направо в MySQL (думаю, несколько значений для каждого идентификатора)? - PullRequest
2 голосов
/ 03 ноября 2010

Задача состоит в том, чтобы переместить данные, как показано в таблице 1, в таблицу 2.

Таблица (1)

ID  Val
--  ---
1   a
1   b
1   c
2   k
3   l
3   m 
3   n

Значения столбцов зависят отколичество уникальных значений для каждого идентификатора.в данном случае это 3, но в реальном мире это может быть 20!

Таблица (2)

ID  Val1 Val2 Val3  
--  --   --   --
1   a    b    c
2   k
3   l    m    n

Как мне справиться с этим для меньших значений Valстолбцы (в данном случае 3):

Я создаю временную таблицу.

create table test(ID int not null, b int auto_increment not null,primary key(ID,b), Val varchar(255));

Затем я вставляю данные для проверки.

Я получаю следующее (у меня естьдля создания столбцов Val вручную):

ID  Val  b
--  ---  --
1   a    1
1   b    2
1   c    3
2   k    1
3   l    1
3   m    2
3   n    3

Я знаю, что это утомительный процесс с большим количеством ручной работы.Это было до того, как я влюбился в Python!Эффективное решение в Python для этой проблемы действительно ценится!

Это то, что я имею до сих пор

import MySQLdb
import itertools
import dbstring

cursor = db.cursor()

cursor.execute("select ID, val from mytable")
mydata = cursor.fetchall()

IDlist = []
vallist = []
finallist = []

for record in mydata:
    IDlist.append(record[1])
    vallist.append(record[2])

zipped = zip(IDlist,vallist)
zipped.sort(key=lambda x:x[0])

for i, j in itertools.groupby(zipped, key=lambda x:x[0]):
    finallist = [k[1] for k in j]
finallist.insert(0, i)
finallist += [None] * (4 - len(finallist))  ### Making it a uniform size list
    myvalues.append(finallist)

cursor.executemany("INSERT INTO temptable VALUES (%s, %s, %s, %s)", myvalues)


db.close()

1 Ответ

2 голосов
/ 03 ноября 2010

Pytonic способ сделать это состоит в использовании itertools.groupby

import itertools

a = [(1, 'a'), (1, 'b'), (2, 'c')]

# groupby need sorted value so sorted in case
a.sort(key=lambda x:x[0])

for i, j in itertools.groupby(a, key=lambda x:x[0]):
    print i, [k[1] for k in j]

возвращение

1 ['a', 'b']
2 ['c']
...