Python从Lis中删除几个重复项

2024-05-15 18:03:58 发布

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

我知道类似的问题已经有了答案,但我认为我的情况有点不同。 我有一个mysql数据库,有一个大表(40000多个条目) 表结构如下:

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

我的问题:

  1. 为什么代码删除了大约2000个项目?它能去除任何一种 复制品?

  2. 获得结果的最佳方法是什么?


Tags: noiddbdatanullcursorlongprint
1条回答
网友
1楼 · 发布于 2024-05-15 18:03:58

它将删除除最后一行之外具有相同消息的所有行,请考虑以下代码:

>>> {1:2, 1:3}
{1: 3}

您正在构建一个对同一个键有多个赋值的dict,只有最后一个赋值才会持久

返回到:

(dict((x[0], x) for x in data).values()

从末尾开始,它列出字典的值

>>> {1:'a', 2:'b'}.values()
['a', 'b']

dict是从生成器(“tuple of tuples”)创建的:

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

相关问题 更多 >