Объединение строк из кортежей словаря разной длины

#python #dictionary #tuples

#python #словарь #кортежи

Вопрос:

У меня есть словарь, созданный с позициями баскетболистов, где ключом является имя игрока, а значением является кортеж с их позицией (позициями). Например: {‘Player1’: (‘SF’, ‘PF’), ‘Player2’: ‘C’, ‘Player3’: ‘SG’}

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

Есть ли способ перебирать ключи и каждое отдельное значение для каждого игрока или мне нужно создать вложенный цикл для условий, когда кортеж имеет несколько значений?

 for k,v in player_position_dict.items():
    print(v[1])
 

создает ошибку, потому что, очевидно, некоторые позиции не будут иметь этого индекса, поэтому мне интересно, есть ли другой цикл, который я могу использовать, чтобы проверить, имеет ли значение несколько элементов? Я пытался использовать len(), но это либо возвращает длину строки, если она занимает одну позицию, либо длину кортежа, так что это недостаточно различается.

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

1. У вас есть ожидаемый результат?

2. Вы пишете «… и значение, являющееся кортежем с их позицией (позициями)», но затем вы показываете dict, где некоторые значения являются кортежами, а другие — строками. Что это?

Ответ №1:

Возможно, вы могли бы использовать isinstance() перед проверкой с len() :

 player_position_dict = {
    'Player1': ('SF', 'PF'),
    'Player2': 'C',
    'Player3': 'SG',
    'Player4': ('PG'),
}
some_string_to_concentate_with = 'some_string_to_concentate_with'
for player, position in player_position_dict.items():
    if isinstance(position, tuple):
        if len(position) > 1:
            print(f'{player} has multiple positions:')
            for pos in position:
                print(f'{some_string_to_concentate_with}_{pos}')
        elif len(position) == 1:
            print(f'{player} has one position:')
            print(f'{some_string_to_concentate_with}_{position[0]}')
    else:
        print(f'{player} has one position:')
        print(f'{some_string_to_concentate_with}_{position}')
 

Вывод:

 Player1 has multiple positions:
some_string_to_concentate_with_SF
some_string_to_concentate_with_PF
Player2 has one position:
some_string_to_concentate_with_C
Player3 has one position:
some_string_to_concentate_with_SG
Player4 has one position:
some_string_to_concentate_with_PG
 

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

1. Просто любопытно — есть ли причина, по которой вы использовали жирный текст вместо code format для isinstance() и len() ?

2. Люди (т. Е. OP) с большей вероятностью будут нажимать на ссылки, когда они выделены жирным шрифтом. Обычно я использую что-то вроде [<code>str.<b>upper()</b><code>](http …), Где только часть текста выделяется жирным шрифтом, когда это уместно. Но на этот раз я просто забыл добавить форматирование кода.