2016-03-11 1 views
0

В настоящее время это работает для того, что я пытаюсь сделать (где «i» - это номер, который я проверяю, если он находится в «цифре»):Python 3 - Проверьте, является ли цифра внутри числа с учетом понимания

if str(digit) in str(i): 
    count += 1 

Однако, когда я пытаюсь использовать, если понимание я получаю неверный синтаксис:

count = [count + 1 if str(digit) in str(i)] 

Я пробовал несколько различных способов, используя только [число + = 1, если ...] и count = [count + 1 if ...]

Может ли кто-либо предоставить проницательность в этом вопросе?

+2

Что вы хотите сделать с пониманием? В первом случае 'count' является' int'. Во втором 'count' будет' list'. Они не то же самое, поэтому неясно, что вы хотите делать. – SethMMorton

+0

[Синтаксис синтаксиса списка] (http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Comprehensions.html). Что вы на самом деле пытаетесь сделать? – Kupiakos

+0

В первом примере вы увеличиваете 'count', который является целым числом, но во втором примере вы пытаетесь вернуть' count', который является списком. Почему вы хотите использовать список над целым числом? – Shrey

ответ

1

Список понимание (в квадратных скобках) используются для создания списка. Но в вашем случае вы действительно не создаете ни одного списка. Однако, если вы пытаетесь написать инлайн, если, попробуйте -

count = count + 1 if str(digit) in str(i) else count 
3

В настоящий момент нет ничего плохого в том, как вы это делаете сейчас. Просто хочу указать на это. Если вы просто пытаетесь сделать это в одной строке, возможно, this решение - это то, что вы ищете.

Но чтобы ответить на ваш вопрос Понимание:

У вас есть две проблемы здесь происходит, что я хотел бы отметить.

  1. Вы не должны проверить, если у вас есть цифры в строке, пытаясь привести его к str. Просто используйте isdigit против персонажа, которого вы проверяете.

  2. Вы не можете использовать понимание так, как вы его пытаетесь использовать. То, что вы должны понимать в понимании, заключается в том, что вы создаете новый список и берете этот новый список и назначаете его переменной (в вашем случае count). Так как это сделать:

    Количество = [число + 1 ....]

Действительно не имеет особого смысла делать.

Что вы должны делать вместо этого, если вы хотите сделать это в понимании,

перебирать каждый символ в a, для каждого символа, проверьте, если это цифра:

[c.isdigit() for c in a] 

сейчас , с этой частью выше. У вас будет список из 1s для всех цифр вашего слова. Следующий шаг - sum все вместе. Теперь, дополнительный бит информации, на которую нужно обратить внимание, заключается в том, что при вызове sum мы будем потерять квадратные скобки, потому что вместо этого мы будем использовать то, что называется generator expression.

Итак, со всем этим сказано и сделано. Ваше окончательное решение:

a = "fjf7jjjf77773jf3j" 


print(sum(c.isdigit() for c in a)) 

# outputs 7 
+0

На самом деле это не понимание списка. Это выражение генератора. Не то, чтобы в этом что-то не так, но вы не даете 'sum()' список; вы даете ему генератор. – zondo

+0

@zondo Да, я знаю об этом. Я не упоминал об этом в своем решении. Но я включил эту деталь в справочную документацию, чтобы прочитать ее. Хорошо с тобой? – idjaw

+1

Отлично. Теперь +1;) – zondo

0

Я не уверен, почему вы хотели бы получить список в этом случае, так как в первом примере, вы просто увеличиваете целочисленную переменную count.Если вы ищете что-то более тонкое, вы можете попробовать использовать функцию следующим образом:

def count_letter_instance(string="", letter=""): 
    return sum([1 for x in string if x == letter]) 

print(count_letter_instance("hello hello hello", "h")) 
print(count_letter_instance("cat cat cat", "c")) 

Выход:

3 
3 
1

Вы можете просто подвести логическое значение из character.isdigit(), где символ каждого символа в строке.

Рассмотрим:

>>> s='abc123def456' 
>>> [c.isdigit() for c in s] 
[False, False, False, True, True, True, False, False, False, True, True, True] 
>>> sum(c.isdigit() for c in s) 
6