Соедините два цикла for, разделенных оператором print, в один - PullRequest
0 голосов
/ 12 апреля 2011

В следующем коде все работает, как и ожидалось.

Он получает пользовательский ввод длиной 4 символа, который заканчивается 0.

И просто добавляет в диктофон хранилища вхождения гласныхи согласные.

input =""   #get input from user

while 4 < len(input) or 4 > len(input) or input[-1] != "0": #string has to be 4 char long and end in 0
    input = raw_input("insert code:")

occurrences = {"a":0,"e":0,"i":0,"o":0,"u":0,"consonants":0}    #store the vouel count



for x in input:
    if x in occurrences.keys():
        occurrences[x] += 1  #count cowels
    elif x != "0":
        occurrences["consonants"] += 1   #count consonants


for x in occurrences:
    if occurrences[x] > 0 and x != "consonants":
        print x + ",",

print "were inserted",


for x in occurrences:
    if occurrences[x] > 0 and x != "consonants":
        print str(occurrences[x]) + ",",

print "times respectively"



if occurrences["consonants"] == 1:
    print "there was %d consonant"%occurrences["consonants"]
else:
    print "there was %d consonants"%occurrences["consonants"]

Для ввода «aef0» программа напечатает:

e, a, были вставлены 1, 1, разсоответственно был 1 согласный

Мои вопросы касаются именно этих строк.

Я знаю, что должен быть лучший способ сделать это:

for x in ocurrances:
    if ocurrances[x] > 0 and x != "consonants":
        print x + ",",

print "were inserted",


for x in ocurrances:
    if ocurrances[x] > 0 and x != "consonants":
        print str(ocurrances[x]) + ",",

print "times respectively"

Это просточувствует себя неряшливо.

Что мне не нравится в этом, так это то, что я дважды вызываю цикл, и я чувствую, что это может быть только один шаг гораздо более элегантным способом, но я не нахожуспособ сделать это.

Псевдокод (или любой другой) того, чего я пытаюсь достичь, будет следующим:

loop the dictionary
print all key with values >= 1
print "were inserted" only once
print all the respective vales.
print "times respectively"

Как я уже сказал, я хочу такой же вывод,но если выразить это более элегантно, я предполагаю, что элегантный подразумевает только один цикл, но любые другие (более элегантные) варианты приветствуются!

Я думал о том, чтобы сделать что-то вроде this , но это явно не работает.(Не беспокойтесь, это просто неправильно, но подход показывает, к чему я стремился)

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Другой способ написания вашего кода может быть примерно таким:

print ", ".join(k for k, v in occurrences.items() if k != "consonants" and v > 0),
print "were inserted"
print ", ".join(str(v) for k, v in occurrences.items() if k != "consonants" and v > 0),
print "times respectively"

Вы можете сократить это немного больше, выделив поиск:

a = [(k, str(v)) for k, v in occurrences.items() if k != "consonants" and v > 0]
print ", ".join(x[0] for x in a), "were inserted",
print ", ".join(x[1] for x in a), "times respectively"
0 голосов
/ 12 апреля 2011

У вас есть еще несколько проблем с элегантностью и другими важными вещами. Во-первых, ваши пользователи восстали бы против необходимости набирать 0, с которым вы ничего не делаете осмысленно. На самом деле вы должны посвятить код игнорированию его! Ведение подсчета согласных в слове довольно неэлегантно. Вы не проверяете, набрал ли пользователь все буквы. Вы не обрабатываете прописные буквы.

Вот код, который решает эти проблемы, а также несколько подробностей:

input = ""   # get input from user
while len(input) != 3 or not input.isalpha():
    input = raw_input("insert code:").lower()
ocurrances = {"a":0, "e":0, "i":0, "o":0, "u":0}
nconsonants = 0
for x in input:
    if x in ocurrances:
        ocurrances[x] += 1  #count vowels
    else:
        nconsonants += 1   #count consonants
for x in ocurrances:
    if ocurrances[x]:
        print x + ",",
print "were inserted",
for x in ocurrances:
    if ocurrances[x]:
        print str(ocurrances[x]) + ",",
print "times respectively"
if nconsonants == 1:
    print "there was 1 consonant"
else:
    print "there were %d consonants" % nconsonants

и вы можете изменить "вхождения" на "вхождения". Кстати, если количество гласных меньше 2, результат будет не очень приятным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...