我知道类似的问题已经有了答案,但我认为我的情况有点不同。 我有一个带有大表的mysql数据库(40.000+条目) 表结构是这样的:
Field | Type |Null |Key |Default | Extra
-----------------------------------------------------
Messaggio| longtext |NO | |NULL |
Id | bigint(20) |NO | |NULL |
Data | date |NO | |NULL |
Partito | text |NO | |NULL |
Numero | bigint(23) |NO |PRI |NULL |auto_increment
我必须删除“Messaggio”,“Id”和“Partito”中具有相同值的行的重复项,例如:
Messaggio |Id | Data | Partito | numero |
----------------------------------------------------------
long_text1 | 123 | somedate | M5s | 1 |
long_text1 | 123 | somedate | M5s | 2 |
long_text2 | 123 | somedate | M5s | 3 |
在这种情况下,我必须删除前两个条目之一。
我试过这个
db = MySQLdb.connect(host="localhost", port=xxxxx, user="xxxxxxx", passwd="xxxxxx", db="xxxxx", charset='utf8', use_unicode=True)db.ping(True)
cursor = db.cursor()
cursor.execute("SET NAMES utf8;")
cursor.execute("SELECT `Messaggio`, `Id`, `Data`, `Partito`, `Numero` FROM `Statuses` WHERE 1")
data = cursor.fetchall()
data2 = (dict((x[0], x) for x in data).values()
print (data2)
print (len(data))
print (len(data2))
输出:
- a very long list
- 41804
- 39558
我不清楚这段代码((dict((x[0], x) for x in data).values()
)做了什么(我对python很新,我也想弄清楚字典是如何工作的)。首先应该删除相同的列表(在5个字段中具有相同的值),但这是不可能的,因为字段'Numero'是AI所以它不能有重复(我已经检查了Mysql上的查询并且没有重复的'Numero' '发现)
我的问题:
为什么代码删除了大约2.000项?它删除任何类型的 重复
获得结果的最佳方式是什么?
答案 0 :(得分:1)
除去最后一行之外,它删除所有具有相同Messaggio的行,请考虑以下代码:
>>> {1:2, 1:3}
{1: 3}
你正在构建一个dict,它具有对同一个键的多个赋值,只有最后一个仍然存在
回到:
(dict((x[0], x) for x in data).values()
从结尾开始,它列出了字典的值
>>> {1:'a', 2:'b'}.values()
['a', 'b']
dict是从生成器(“元组元组”)创建的:
>>> dict(((1,'a'),(2,'b')))
{1: 'a', 2: 'b'}
最内在的部分就像:
>>> list((x[0], x) for x in [[1,2,3], ['a','b','c']])
[(1, [1, 2, 3]), ('a', ['a', 'b', 'c'])]
所以我想你想用:
(dict((x[0], x[1], x[3]), x) for x in data).values()