Witam Piszę skrypt w Pythonie 2.7, aby połączyć dwa oddzielne listy i stworzyć nowy bez brakujących wartości, ale z odpowiednimi indeksami (patrz przykład do lepszego wyjaśnienia). Załóżmy, że wyodrębniłem dwie listy z zestawu danych źródłowych:

  • Lista 1 - z parametrem (np. Rok)
  • LISTA 2 - W przypadku wartości parametru

Jednak nie wszystkie parametry mają wartości na liście 2 (brak danych). Zadaniem jest utworzenie dwóch list, które pozwolą na wykres wykresowy oparty tylko na kompletnych danych (parach).

Obecnie używam skryptu poniżej, który działa dobrze.

Moje pytanie: Czy istnieje łatwiejsza metoda?

Zwłaszcza, gdy istnieje kilka list z brakującymi danymi, ta metoda stałaby się coraz trudniejsze do zarządzania. Lub po wyodrębnionej listy będzie miała Nan zamiast pustego ciągu "".

Jakieś pomysły, biblioteki?

list1 = [2000,2001,2002,2003,2004,2005,2006,2007]
list2 = [0,1,2,3,"",5,"",7]

list1_reduced = [] 
list2_reduced = []

i=0
for element in list2:
    if element != "":
        list1_reduced.append(list1[i])
        list2_reduced.append(list2[i])
    i += 1

print list1_reduced
print list2_reduced

Wynik:

[2000, 2001, 2002, 2003, 2005, 2007]
[0, 1, 2, 3, 5, 7]

Używam Pythona 2.7 (Anaconda), Spyder IDE, Windows 10.

Każda pomoc była bardzo doceniana.

Dziękuję Ci!

1
Roberto 25 czerwiec 2017, 15:06

3 odpowiedzi

Najlepsza odpowiedź
list1 = [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007]
list2 = [0, 1, 2, 3, "", 5, "", 7]

list1, list2 = [list(z) for z in
                    zip(*[(x, y) for (x, y) in
                          zip(list1, list2) if y != ''])]

print(list1)
print(list2)

Wynik:

[2000, 2001, 2002, 2003, 2005, 2007]
[0, 1, 2, 3, 5, 7]
2
glegoux 25 czerwiec 2017, 13:20

To powinno być realne rozwiązanie:

list1 = [2000,2001,2002,2003,2004,2005,2006,2007]
list2 = [0,1,2,3,"",5,"",7]

reducedIndexes = [i for i,x in enumerate(list2) if x != '']

list1_reduced = [list1[i] for i in reducedIndexes] 
list2_reduced = [list2[i] for i in reducedIndexes]

Zawartość obniżonych list:

[2000, 2001, 2002, 2003, 2005, 2007]
[0, 1, 2, 3, 5, 7]
0
Ébe Isaac 25 czerwiec 2017, 12:26

Proszę bardzo

[(x, y) for (x, y) in zip(list1, list2) if y != '']

Alternatywnym testem testuje dla typu IS ITSEGER: isinstance(y, int) zamiast y != ''.

0
Elmex80s 25 czerwiec 2017, 12:07