Python匹配/比较两个数据/元组列表

2024-04-25 09:45:31 发布

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

我有两组数据,一组来自django的queryset,它将返回如下数据:

sr_data =  ShowroomConfigData.objects.only('location').filter(is_showroom=True).exclude(location='MajorSite')
for i in sr_data:
    print i.location

London
Glasgow
Edinbrugh
...

第二组数据来自外部Mysql查询,该查询返回元组列表:

^{pr2}$

esr_数据示例:

('John Smith', '0123456789', 'billy', 'London', 'London', datetime.date(2014, 12, 19), '0123456789', 'Bobs Builders', '123 place', 'city', 'add', 'London', 'LDN 103', ', '', '', ' ', '', '', ' ', ' ', ' ', ' ', '', ' ', '')

它们也不一定是那样的顺序,我想两者的顺序都是随机的。在

但是外部查询有一些我想定期导入django的细节。在

所以我需要循环这两个列表,并在它们匹配时将数据导入django,唯一的问题是,循环它们可能永远不会匹配。在

有没有人知道我能做这个的方法?在

谢谢


Tags: 数据djangoonly列表dataobjects顺序is
3条回答

所以,据我所知,你有两个变量,它们都是不可解的。它们包含一些值,您希望在其中一个项与另一个项匹配时查找其中的项。

所以,一种天真的做法是:

for i in esr_data:
    for j in sr_data:
        if i[3] == j.location:
            # Import into django as they match

但这并不是很好,因为它是O(M * N),其中M是esr_数据的num,N是sr_数据的num

你M和N很大吗?如果没有,这是可行的。

要降低大型数据的复杂性,请首先在以下两个位置找到共同的位置:

^{pr2}$

这将复杂性降低到O(L * L),其中L是公共元素的数目。

读完其他答案后,我开始质疑自己的假设,认为实际的问题更多:

两个元组列表,根据特定字段查找两者中的行(例如:字段1、3和5都匹配)

基于这个问题,您可以从第一个列表构建一组“匹配的位”,然后从第二个列表中提取匹配该集合中任何内容的项,例如,基于每个元组中第一个和最后一个项目的以下筛选器:

x = [(1,2,3),(2,3,4),(3,4,5),(4,5,6)]
y = [(2,9,4),(4,9,6),(7,8,9),(1,1,1)]

set_x = set((i[0], i[2]) for i in x) # Set of unique keys in x

for item in y:
    if (item[0], item[2]) in set_x:
         pass # Do some importing here

我把我的原始答案写在下面,以防有用。


假设问题是:

  • 有两个元组的iterable
  • 每个列表中的“匹配”元组包含所有相同的值,但顺序不同(即:字段的顺序不同,但值的数量相同,所有这些值都需要匹配)
  • 你想导入一个新的元组列表,导入两个原始列表中的值?在

一种选择是将元组列表转换成一组(冻结的)集合,然后简单地拉交集-即:两个集合中存在的所有集合。例如:

^{pr2}$

看起来esr_data返回元素的元组,而不是元组的列表。

所以你只需要比较相似元素的列表。您可以为此设置:

result = list(set(sr_data).intersection(esr_data))

相关问题 更多 >