- первые три цифры находятся в моем первом списке,
- со второго по четвёртый список — во втором, а
- с третьего по пятый — в последнем списке:
l1=["234","239","881"]
l2=["348","551","399"]
таким образом должно получиться: ['12348', '12399'].
Поэтому я написал функцию is_successor(a, b), который проверяет, перекрываются ли a и b:
def is_successor(a:str,b:str)->bool:
"""tests if strings a and b overlap"""
return a[1:]==b[:2]
Затем я могу достичь своей цели, написав эту вложенную структуру цикла/проверки, которая в основном добавляется обратно к передним строкам и в результате дает все действительные строки:
pres=[]
for c in l2:
for b in l1:
if is_successor(b,c):
for a in l0:
if is_successor(a,b):
pres.append(a[0]+b[0]+c)
pres
- Я знаю, что мог бы написать это как понимание списка, но для моих исходных данных у меня больше вложенных списков, и я теряю читабельность даже при понимании списка.< /li>
Я начинаю с l2 -> l0, потому что в моих исходных данных списки становятся длиннее, чем ниже индекс, и, таким образом, я могу отфильтровать больше случаев раньше, таким образом . - Один цикл по всем комбинациям l0,l1,l2 и проверка последовательности всех элементов a,b,c одновременно будет работать, но это проверка гораздо больше ненужных комбинаций, чем в моей нынешней конструкции.
Как можно ли отвлечь этот вложенный цикл и вызов условной проверки? Есть ли питонический способ зафиксировать повторение for -> is_successor()?
Более крупный ввод может быть:
primes=[2,3,5,7,11,13,17]
lsts=[
[
str(j).zfill(3)
for j in range(12,988)
if not j%primes
]
for i in range(len(primes))
]
Подробнее здесь: https://stackoverflow.com/questions/788 ... catination