athletes = [['Phelps', 'Lochte', 'Schooling', 'Ledecky', 'Franklin'], ['Felix', 'Bolt', 'Gardner', 'Eaton'], ['Biles', 'Douglas', 'Hamm', 'Raisman', 'Mikulak', 'Dalton']]

t = [] 
other = []

for lst in athletes:
    for lst2 in athletes:
        if 't' in lst2:
            t.append(lst2)
        else:
            other.append(lst2)
-1
Claire Hultquist 17 grudzień 2019, 00:24
1
Jakie jest pytanie?
 – 
roganjosh
17 grudzień 2019, 00:26
Wewnętrzna pętla for powinna być for lst2 in lst
 – 
dcg
17 grudzień 2019, 00:27

3 odpowiedzi

# make a "flat" list of names
flat_list = sum(athletes, [])


# use list comprehensions
t = [x for x in flat_list if "t" in x]
other = [x for x in flat_list if "t" not in x]
0
Simon Crane 17 grudzień 2019, 00:28
Dlaczego miałbyś powtarzać całą listę dwukrotnie?
 – 
roganjosh
17 grudzień 2019, 00:30
Myślę, że jest to bardziej czytelne niż użycie pętli for, a to i tak nie zajmie dużo czasu
 – 
Simon Crane
17 grudzień 2019, 00:33
1
Zajmuje to około dwa razy więcej czasu. I nie wyjaśnia niczego, co było nie tak z oryginalnym podejściem
 – 
roganjosh
17 grudzień 2019, 00:34
for x in [item for sublist in athletes for item in sublist]:
    t.append(x) if 't' in x else other.append(x)

Wynik:

t:  ['Lochte', 'Bolt', 'Eaton', 'Dalton']
other:  ['Phelps', 'Schooling', 'Ledecky', 'Franklin', 'Felix', 'Gardner', 'Biles', 'Douglas', 'Hamm', 'Raisman', 'Mikulak']
1
Michael Chatiskatzi 6 wrzesień 2020, 23:07

Możemy użyć przepisu partition z itertools .

from itertools import chain, tee, filterfalse

def partition(pred, iterable):
    'Use a predicate to partition entries into false entries and true entries'
    # partition(is_odd, range(10)) --> 0 2 4 6 8   and  1 3 5 7 9
    t1, t2 = tee(iterable)
    return filterfalse(pred, t1), filter(pred, t2)

athletes = [['Phelps', 'Lochte', 'Schooling', 'Ledecky', 'Franklin'], ['Felix', 'Bolt', 'Gardner', 'Eaton'], ['Biles', 'Douglas', 'Hamm', 'Raisman', 'Mikulak', 'Dalton']]
flat_athletes = chain.from_iterable(athletes)

without_t, with_t = partition(lambda ath: "t" in ath, flat_athletes)

without_t i with_t z be iteratorami. Jeśli chcesz tworzyć listy, po prostu zrób without_t = list(witout_t).

1
Kyle Parsons 17 grudzień 2019, 00:55