Найти недостающие строки, содержащие значение int из заданного списка - PullRequest
3 голосов
/ 02 мая 2019

Учитывая список строк, скажем mystr= ["State0", "State1", "State2", "State5", "State8"].

Мне нужно найти недостающие состояния (здесь "State3", "State4", "State6", "State7"). Есть ли возможность найти его?

Желаемый вывод: mylist = ["State3", "State4", "State6", "State7"]

Ответы [ 4 ]

3 голосов
/ 02 мая 2019

Предполагая, что наибольшее число в списке может быть неизвестно, один из способов - извлечь числовую часть в каждой строке, взять set.difference с range до наибольшего значения и создать новый список, используя список. понимание:

import re
ints = [int(re.search(r'\d+', i).group(0)) for i in mystr]
# [0, 1, 2, 5, 8]
missing = set(range(max(ints))) - set(ints)
# {3, 4, 6, 7}
[f'State{i}' for i in missing]
# ['State3', 'State4', 'State6', 'State7']
2 голосов
/ 02 мая 2019

Достаточно просто со списком и f-строками:

mystr = ["State0", "State1", "State2", "State5", "State8"]

highest = max(int(state.split('State')[-1]) for state in mystr)
mylist = [f"State{i}" for i in range(highest) if f"State{i}" not in mystr]

print(mylist)

Выход:

['State3', 'State4', 'State6', 'State7']

Обратите внимание, что это решение является хорошим и общим и будет работать, даже если последний элемент в исходном списке, например, "State1024", и даже если исходный список не отсортирован.

1 голос
/ 02 мая 2019

Можно использовать следующее решение:

lst = ["State0", "State1", "State2", "State5", "State8"]

states = set(lst)    
len_states = len(states)
missing = []
num = 0

while len_states:
    state = f'State{num}'
    if state in states:
        len_states -= 1 
    else:
        missing.append(state)
    num += 1

print(missing)

Вывод:

['State3', 'State4', 'State6', 'State7']

1 голос
/ 02 мая 2019

Я не уверен, что вы спрашиваете. Я думаю, что это то, что вы ожидаете.

mystr= ["State0", "State1", "State2", "State5", "State8"]
print(['State'+str(p) for p in range(8) if 'State'+str(p) not in mystr ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...