просматривая словарь и печатая его значения в последовательности - PullRequest
1 голос
/ 08 сентября 2010
def display_hand(hand):
    for letter in hand.keys():
        for j in range(hand[letter]):
            print letter, 

Вернет что-то вроде: b e h q u w x.Это желаемый вывод.

Как я могу изменить этот код, чтобы получить вывод только после того, как функция закончила свои циклы?

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

def display_hand(hand):
    dispHand = []
    for letter in hand.keys():
        for j in range(hand[letter]):
            ##code##
    print dispHand

ОБНОВЛЕНИЕ Ответ Джона очень элегантный, я нахожу.Позвольте мне, однако, расширить ответ Кугеля: подход Кугеля ответил на мой вопрос.Однако я продолжал сталкиваться с дополнительной проблемой: функция всегда возвращала None, а также вывод.Причина: всякий раз, когда вы явно не возвращаете значение из функции в Python, None неявно возвращается.Я не мог найти способ явно вернуть руку.В подходе Кугеля я стал ближе, но рука все еще находится в цикле FOR.

Ответы [ 4 ]

3 голосов
/ 08 сентября 2010

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

print ' '.join(letter for letter, count in hand.iteritems() for i in range(count))

Давайте разберем это по частям. Я буду использовать пример словаря, у которого есть несколько счетчиков больше 1, чтобы показать работу повторяющейся части.

>>> hand
{'h': 3, 'b': 1, 'e': 2}
  1. Получите буквы и цифры в форме, которую мы можем перебрать.

    >>> list(hand.iteritems())
    [('h', 3), ('b', 1), ('e', 2)]
    
  2. Теперь только буквы.

    >>> [letter for letter, count in hand.iteritems()]
    ['h', 'b', 'e']
    
  3. Повтор каждой буквы count раз.

    >>> [letter for letter, count in hand.iteritems() for i in range(count)]
    ['h', 'h', 'h', 'b', 'e', 'e']
    
  4. Используйте str.join, чтобы объединить их в одну строку.

    >>> ' '.join(letter for letter, count in hand.iteritems() for i in range(count))
    'h h h b e e'
    
1 голос
/ 09 сентября 2010

другой вариант без вложенного цикла

"".join((x+' ') * y for x, y in hand.iteritems()).strip()
1 голос
/ 08 сентября 2010

Ваш код ## возможно?

dispHand.append(letter)

Обновление

Чтобы распечатать свой список, тогда:

for item in dispHand:
    print item,
0 голосов
/ 08 сентября 2010

Используйте

" ".join(sequence)

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

Если в последовательности есть целые числа или другие элементы

" ".join(str(x) for x in sequence)
...