Сравнить все элементы списка списка Python - PullRequest
0 голосов
/ 25 августа 2018

Это часть моего списка. В моем исходном списке более 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 1009 *

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]]

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Обратите внимание, что a[9][1] - не первый элемент в этом элементе, это второй элемент, первый элемент - a[9][0], так как списки начинаются с 0. Ваша проблема заключалась (помимо прочего) в количестве выполненных вами итераций,Подумайте об этом, если n - это количество элементов в списке, и для любого данного элемента x вы сравниваете его с каждым элементом в списке, то вам следует перебирать список n^n раз.Принимая во внимание, что 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])
0 голосов
/ 25 августа 2018

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 ...) ко всем 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] последнего набора, а не первый элемент последнего набора.

Также, пожалуйста, учтите, что это решение будет сравнивать себя с самим собой. Чтобы обойти это, вы можете добавить 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, так что вы также можете просто оценить только <= и проверить это в lista перед вами append

Я был неправ, я забыл, что мы добавляем, если он также равен, так что наслаждайтесь надеждой, что это решение было тем, что вы искали!

0 голосов
/ 25 августа 2018

Вот (своего рода) функциональный подход (я не пробовал это на 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)) # []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...