Pythonistas,如何在MySQL中从上到下、从左到右移动数据(为每个ID考虑多个值)?

2024-09-28 21:27:00 发布

您现在位置:Python中文网/ 问答频道 /正文

手头的任务是将表1所示的数据移动到表2中的数据。在

表(1)

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

Val列取决于每个ID的唯一值的数量。在本例中,它是3,但在现实世界中可能是20!在

表(2)

^{pr2}$

如何处理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()

Tags: 数据keyinimportidforvalrecord
1条回答
网友
1楼 · 发布于 2024-09-28 21:27:00

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]

返回

^{pr2}$

相关问题 更多 >