Как проверить, есть ли последовательность целых чисел в списке

#python #list

#python #Список

Вопрос:

Я хочу, чтобы программа продолжала выполняться до тех пор, пока каждый элемент в списке не станет строкой.
Это

 li = [1, 2, 6, 'h', 'y', 'h', 'y', 4]
  

следует прекратить, когда

 li = [all elements type are strings]
  
 li = [1, 2, 6, 'h', 'y', 'h', 'y', 4]

while '''there are still numbers in the list''':
    #code keeps on executing and updating li[] with string input
else:
    # output the list with no numbers
  

Это то, что я пробовал, но если элемент first[0] and и last[7] int становится строкой, цикл while переходит к последнему условию else даже при наличии в списке типа. если выполняется последовательно, все работает нормально.

 li = [8, 2, 6, 'h', 'y', 'h', 'y', 4]

for a in li:
    while a in li:
        if type(a) == int:
            x = int(input('Position: '))
            entry = input('Enter: ')
            li.pop(x)
            li.insert(x, entry)
            print(li) # to see what's happening
            li = li
    else:
        print('Board is full')

print(li)
  

Но я не хочу, чтобы это было последовательно.
Следовательно, оно должно продолжаться, если

 li = [c, 2, 6, 'h', 'y', 'h', 'y', f]
  

и остановитесь, когда

 li = [a, b, c, 'h', 'y', 'h', 'y', d]
  

все строки

Комментарии:

1. Создайте лямбда-выражение типа (x)==int, используйте его со встроенной функцией «все» (требует больших вычислительных затрат для большого списка, но здесь все в порядке)

2. Ваш общий цикл должен быть «пока не завершен», поэтому, если я правильно понял, никакого другого механизма цикла не требуется. Прямо сейчас ваш цикл while ничего не делает — он просто проверяет, находится ли a в li, что всегда верно, потому что вы получили a от li и никогда не меняли его.

3. Вы правы @KennyOstrom. Условие всегда остается верным

Ответ №1:

Вы можете использовать all или any в сочетании с string.isnumeric() , чтобы проверить это

 li = ['a', 1, 2]
while any(str(ele).isnumeric() for ele in li):
    modify li ...
  

Комментарии:

1. Спасибо, хотя у меня это не сработало. Но вы дали мне фору 🙂

Ответ №2:

Решение, о котором вы просили, возможно. Но один совет при написании на python — избегать явной проверки типа (type(a) == int). ниже приведено простое решение.

 import string
import random
letter = random.choice(string.ascii_letters) #swapping data
xe = [8, 2, 6, 'h', 'y', 'h', 'y', 4]
for i in range(len(xe)):
    try:
        xe[i].upper()
    except:
        xe.pop(i)
        xe.insert(i,letter)
print(xe)
  

Комментарии:

1. Вам следует избегать bare except , потому что он улавливает такие вещи, как SystemExit .

2. дуэльно отмечено @gmds

3. Это кажется мне очень странным использованием try / except. Вызов upper ничего не делает, кроме как действует как неявная проверка типа — и явное лучше, чем неявное. Просто сделайте if not isinstance(xe[i], str): (или basestr в python 2). Также pop insert было бы более четко и просто написано xe[i] = letter .

4. Спасибо Натану за ваш большой вклад, это полезно. Но я подумал, что более полезно играть с интерфейсом объектов, используя его метод (в данном случае верхний), чем проверка типа. И спасибо за подсказку pop insert

Ответ №3:

Я думаю, вы можете сделать это:

 li = [1, 2, 3, h, y, 5, g, 3]
length = len(li)
while count != length:
    for row in li:
    if type(row) == int:
        li.pop(row)
        count  = 1
  

Ответ №4:

Гекконы дали мне подсказку. Спасибо вам за это. Я обнаружил, что использование isinstance с any() решает проблему

 li = ['a', 1, 2]
while any(isinstance(element, int) for element in li):
       #code goes here...