#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...