Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python从列表中删除两个重复项_Python_Mysql - Fatal编程技术网

Python从列表中删除两个重复项

Python从列表中删除两个重复项,python,mysql,Python,Mysql,我知道类似的问题已经有了答案,但我认为我的情况有点不同。 我有一个mysql数据库和一个大表(40.000多个条目) 表结构如下所示: Field | Type |Null |Key |Default | Extra ----------------------------------------------------- Messaggio| longtext |NO | |NULL | Id

我知道类似的问题已经有了答案,但我认为我的情况有点不同。 我有一个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       |
在这种情况下,我必须删除前2个条目中的一个

我试过这个

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)表示数据中的x)。values()
)是做什么的(我对python非常陌生,而且我必须弄清楚字典是如何工作的)。首先,它删除了相同的列表(在5个字段中有相同的值),但这是不可能的,因为字段'Numero'是AI,所以它不能有重复项(我在Mysql上查询过,没有找到重复的'Numero')

我的问题:

  • 为什么该代码删除了大约2000个项目?它删除了任何类型的 复制品

  • 获得结果的最佳方式是什么


  • 它删除所有的行,除了最后一个行,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是从生成器(“元组的元组”)创建的:

    最内部的部分类似于:

    >>> 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()
    

    谢谢,所以我有大约2000个条目具有相同的Messaggio,对吗?我正在创建一个没有Messaggio副本的字典?所以我认为使用字典是没有帮助的,关于如何删除在“Messaggio”、“Id”和“Partito”中具有相同值的行的副本,有什么想法吗?没有,您有大约2000个Messaggio被复制,我发布了一个解决方案,我希望它能起作用。谢谢你,我想你必须去掉(dict(((x[0],x[1],x[3]),x)中的一个括号来表示数据中的x。values()或者只是dict((x[0],x[1],x[3]),x)表示数据中的x。values(),顺便说一下,你的答案是正确的,谢谢。
    (dict((x[0], x[1], x[3]), x) for x in data).values()