Перебор списка списков в Python путем сравнения каждого следующего списка с предыдущим и сохранения уникальных списков - PullRequest
1 голос
/ 24 марта 2020

У меня есть список списков в python с двумя значениями с плавающей запятой в каждом списке. Я хотел бы перебрать список списков, но я хочу сохранить первый список в результирующем списке и сравнить каждый следующий список с предыдущим, и если он отличается от предыдущего списка, то мне снова нужно сохранить этот список в результирующем списке .

list_of_lists = [[0.9953129999999999, 13.625421], [0.9953129999999999, 13.625421],[0.9953129999999999, 13.625421], [0.9953129999999999, 13.625421], [0.9953129999999999, 13.625421], [1.6215, 3.26078], [1.6215, 3.26078], [1.6215, 3.26078], [1.6215, 3.26078], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.9050619999999998, 0.011995], [1.9050619999999998, 0.011995], [1.9050619999999998, 0.011995], [1.9050619999999998, 0.011995],[1.7293490000000002, 1.5182360000000001]]

Мой первоначальный подход такой:

resulting_list = []
resulting_list.insert(0,list_of_list[0])
print (resulting_list)
for index, rows in list_of_lists:
if ...

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вы почти на месте, вы помещаете первый подсписок в итоговые списки. и затем выполнить итерацию по оставшимся элементам, затем вы можете проверить, соответствует ли текущий подсписок последнему подсписку в результирующем списке, а если нет, то объявить этот подсписок.

list_of_lists = [[0.9953129999999999, 13.625421], [0.9953129999999999, 13.625421], [0.9953129999999999, 13.625421],
                 [0.9953129999999999, 13.625421], [0.9953129999999999, 13.625421], [1.6215, 3.26078], [1.6215, 3.26078],
                 [1.6215, 3.26078], [1.6215, 3.26078], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871],
                 [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871],
                 [1.0, 12.25871], [1.0, 12.25871], [1.0, 12.25871], [1.9050619999999998, 0.011995],
                 [1.9050619999999998, 0.011995], [1.9050619999999998, 0.011995], [1.9050619999999998, 0.011995],
                 [1.7293490000000002, 1.5182360000000001]]

resulting_list = [list_of_lists[0]]
for sub_list in list_of_lists[1:]:
    if sub_list != resulting_list[-1]:
        resulting_list.append(sub_list)
print(resulting_list)

OUTPUT

[[0.9953129999999999, 13.625421], [1.6215, 3.26078], [1.0, 12.25871], [1.9050619999999998, 0.011995], [1.7293490000000002, 1.5182360000000001]]
0 голосов
/ 24 марта 2020

Я думаю, что вы ищете классическую c операцию "уменьшить" в списке. Таким образом, вам не нужно для l oop:

import functools
def reducer(x,y):
    if(len(x)==0 or x[-1]!=y): return(x+[y])
    return(x)
functools.reduce(reducer, list_of_lists, list())

Вы начинаете с пустого списка в качестве начального значения для аккумулятора и продолжаете добавлять новые элементы, если они отличаются от последнего добавленного .

Вывод:

[[0.9953129999999999, 13.625421], [1.6215, 3.26078], [1.0, 12.25871], [1.9050619999999998, 0.011995], [1.7293490000000002, 1.5182360000000001]]

Если вы хотите быть еще более кратким, вы можете передать анонимную лямбда-функцию непосредственно в вызове, чтобы уменьшить

functools.reduce(lambda x, y: x+[y] if(len(x)==0 or x[-1]!=y) else x, list_of_lists, list())
...