Python фильтрация по списку с кортежами (содержащие целые числа в виде строк) - PullRequest
3 голосов
/ 10 апреля 2020

Я пытаюсь отфильтровать следующий список: tuple = [('7:29', 0.5), ('99:2', 0.35714285714285715), ('10:2', 0.35714285714285715)], используя понимание списка, фильтрация на основе первых элементов из кортежей между символом ':'. Например: filter = [7, 99], таким образом, результат будет: new_tuple = [('7:29', 0.5), ('99:2', 0.35714285714285715)].

Я пробовал следующее решение:

filter_string = [str(item) for item in filter]
tuple_filtered = [(x,y) for (x,y) in tuples if x in filter]

, но он возвращает пустой список, и у меня нет Любая идея, как это исправить. Может кто-нибудь помочь мне?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2020

Сначала, когда вы примените эту строку:

filter_string = [str(item) for item in filter]

Вы применяете функцию str () к объекту кортежа - превращаете весь кортеж в строку. например - str(('99:2', 0.35714285714285715)) -> '(\\'99:2\\', 0.35714285714285715)' Что, на мой взгляд, затрудняет анализ.

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

Наконец, вы можете рассматривать кортеж как массив фиксированного размера, который индексируется, что означает, что вы можете обращаться к первому элементу (по которому вы хотите фильтровать)

Примерно так:

my_tuples = [('7:29', 0.5), ('99:2', 0.35714285714285715), ('10:2', 0.35714285714285715)]
my_filter = [7, 99]
filtered_list =  [t for t in my_tuples if int(t[0].split(':')[0]) 
                  in my_filter]
2 голосов
/ 10 апреля 2020
[(x,y) for (x,y) in tuples if  str(x.split(":")[0]) in filter_string ]

Эквивалентно:

op = []
for (x,y) in tuples :
    if str(x.split(":")[0]) in filter_string:
        op.append((x,y))
...