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

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

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

3
Sharm 2 Май 2019 в 16:22

4 ответа

Лучший ответ

Достаточно просто с пониманием списка и 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», и даже если исходный список не отсортирован.

2
ruohola 2 Май 2019 в 13:39

Предполагая, что наибольшее число в списке может быть неизвестно, один из способов - извлечь числовую часть в каждой строке, взять 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']
3
yatu 2 Май 2019 в 13:26

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

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
Mykola Zotko 2 Май 2019 в 19:09

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

mystr= ["State0", "State1", "State2", "State5", "State8"]
print(['State'+str(p) for p in range(8) if 'State'+str(p) not in mystr ])
1
Shehan Ishanka 2 Май 2019 в 13:25