繁体   English   中英

比较列表Python列表的所有元素

[英]Compare all elements of a list of list Python

这是我列表的一部分。 我的原始清单有30多个项目:

a = [[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]], [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]]

我需要比较我的所有项目a 我的意思是,如果我的第一个项目的前9个项目等于其他项目的前9个项目,则"1, 2, 3, 4, 5, 6, 7, 8, 9"比较项目的[1]最后一项。

我打电话ITEM2像其他项目的a列表

lista = []
for item in a:
    print item
    >>> [[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]]
    >>> [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]
    if item[:1] == item2[:1]:
        if item[9][1] <= item2[9][1]:
            lista.append(item)
        if item[9][1] > item2[9][1]:
            lista.append(item2)


print lista
>>> [[1, 2, 3, 4, 5, 6, 7, 8, 9, [1.8, 1]]

这是(一种)功能方法(我还没有在Python 2.x上尝试过):

from operator import itemgetter

def get_lista(a):
     if a and len(set(map(' '.join, map(str, map(itemgetter(0), a))))) == 1:
          return [a[0][0]] + [min(map(itemgetter(1), a), key=itemgetter(1))]
     return []

a = [[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]], [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]]
lista = get_lista(a)
print(lista) # [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]

get_lista(a)将返回一个空列表, []如果a是空的,或者如果每个项目的第一个子项目a不匹配。

a = [[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]], [[2, 3, 4, 5, 6, 7, 8, 9, 10], [1.8, 1]]]
print(get_lista(a)) # []

请注意, a[9][1]不是该元素中的第一项,它是第二项,因为列表从0开始,第一项是a[9][0] 。您的问题是(除其他事项外)您执行的迭代次数。 考虑一下,如果n是列表中元素的数量,并且对于任何给定元素x您都将其与列表中的每个元素进行比较,那么您应该对列表进行n^n次遍历。 而a for item in a: ...仅在列表中迭代n次。

# our list of lists whom have the same first element and last item
lista = []
a = [[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]], [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]]
for i in range(len(a)):
    for y in range(len(a)):
        # lets check if the first element in each array is the same.
        if a[i[:1]] == a[y[:1]]:
            # if we got here then the first elements must be the same so lets compare second item of the last elements
            if a[i[-1]][1] == a[y[-1]][1]:
                # if we got here then the 2nd item of the last elements must be the same.
                lista.append(a[i] + a[y])

Soloution

a = [[[1, 2, 3, 4, 5, 6, 7, 8, 9],[0.4, 3]],[[1, 2, 3, 4, 5, 6, 7, 8, 9],[1.8, 1]]]

lista = []
for item in a:
    for i in range(0, len(a)): #changed loop method
        if item[0] == a[i][0]:
            if item[1][1] <= a[i][1][1]: #changed to item[1] of last set
                lista.append(item)
            elif item[1][1] > a[i][1][1]:
                lista.append(a[i])

print(lista)

产量

(xenial)vash@localhost:~/pcc/9$ python3 help.py
[[[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]], [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]]
(xenial)vash@localhost:~/pcc/9$ 

这很有趣很有趣!

因此,每个item都有一组item ,首先,我们需要将item[0]与所有item[0]进行比较,但只有一次,因此我比较了item[0] (1、2。 ..)使用a[i][0]到所有item[0] a[i][0] 如果item[0] == a[i][0] ,那么我们可以比较下一组。 接下来,我们将 item[1][0]a[i][1][0] (.04 v 1.8)进行比较。 接下来,我们将item[1][1]a[i][1][1] (3 v 1)进行比较。 如果item<=我们可以append.item ,如果item> ,则我们添加比较集append(a[i])

更新:注意到您想比较最后一组的item[1]而不是最后一组的第一项。

另外,请务必考虑到此解决方案将自身与v进行比较。要绕过此问题,可以if item == a[i]: continue

投诉

我唯一的问题是您要完成的工作。 当您同时比较 >< 当第一个集合经过测试时,.4会变少会追加它的集合,但是当我们比较1.8而更大时,您会再次追加.4集合...

您可以修改并添加if item not in lista以及if a[i] not in lista ,以检查是否要添加的内容已经在lista

        if item[1][0] <= a[i][1][0]:
            if item not in lista:
                lista.append(item)
        elif item[1][0] > a[i][1][0]:
            if a[i] not in lista:
                lista.append(a[i])

但是即使您仍然总是会 append较小的 item因此您最好只评估 <=并在 append之前检查 lista

我错了,我忘记了我们也要追加相等的内容,因此希望您能找到该解决方案!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM