Mam listę list w Pythonie z dwiema wartościami zmiennoprzecinkowymi na każdej liście. Chciałbym iterować na liście list, ale chcę przechowywać pierwszą listę w wynikowej liście i porównywać każdą następną listę z poprzednią i jeśli różni się od poprzedniej listy, to ponownie muszę zapisać tę listę na wynikowej liście .

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

Moje początkowe podejście jest takie;

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

Z góry dziękuję!

1
ali 24 marzec 2020, 13:24

2 odpowiedzi

Najlepsza odpowiedź

Jesteś prawie na miejscu, umieściłeś pierwszą podlistę w wynikowych listach. a następnie iteruj po pozostałych elementach, możesz następnie sprawdzić, czy bieżąca podlista jest zgodna z ostatnią podlistą w wynikowej liście, a jeśli tak nie jest, to umieść tę podlistę.

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)

WYJŚCIE

[[0.9953129999999999, 13.625421], [1.6215, 3.26078], [1.0, 12.25871], [1.9050619999999998, 0.011995], [1.7293490000000002, 1.5182360000000001]]
1
Chris Doyle 24 marzec 2020, 10:39

Myślę, że to, czego szukasz, to klasyczna operacja „redukcja” na liście. W ten sposób nie potrzebujesz pętli for:

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

Zaczynasz z pustą listą jako wartością początkową akumulatora i dodajesz nowe elementy, jeśli różnią się od ostatnio dodanych.

Wynik:

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

Jeśli chcesz być jeszcze bardziej zwięzły, możesz przekazać anonimową funkcję lambda bezpośrednio w wywołaniu, aby zredukować

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