Как чередовать строчные и прописные буквы на словарных клавишах? Python 3 - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в Python 3.

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

мой словарь создается из списка, его ключом является слово (или элемент списка), а его значением является время, когда этот элемент появляется в списке.

kb     = str(input("Give me a string: "));
txt    = kb.lower();      #Turn string into lowercase
cadena = txt.split();     #Turn string into list
dicc   = {};              

for word in cadena:
         if (word in dicc):
             dicc[word] = dicc[word] + 1
         else:
             dicc[word] = 1
print(dicc)

С этим кодом я могу получить, например:

input: "Hi I like PYthon i am UsING python"
{'hi': 1, 'i': 2, 'like': 1, 'python': 2, 'am': 1, 'using': 1}

но я пытаюсь получить:

{'hi': 1, 'I': 2, 'like': 1, 'PYTHON': 2, 'am': 1, 'USING': 1}

Я пытался использовать это:

for n in dicc.keys():
    if (g%2 == 0):
        n.upper()

    else:
        n.lower()
print(dicc)

Но, похоже, я понятия не имею, что я делаю. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Ваша строка n in dicc.keys() неверна. Вы пытаетесь использовать n в качестве позиции в массиве ключей и самого ключа.

Также точки с запятой не нужны.

Это должно делать то, что вы хотите:

from collections import OrderedDict

# Receive user input

kb     = str(input("Give me a string: "))
txt    = kb.lower()
cadena = txt.split()
dicc   = OrderedDict()

# Construct the word counter

for word in cadena:
    if word in dicc:
        dicc[word] += 1
    else:
        dicc[word] = 1

Если вы просто хотите напечатать вывод с чередующимся регистром, вы можете сделать что-то вроде этого:

# Print the word counter with alternating case

elems = []
for i, (word, wordcount) in enumerate(dicc.items()):
    if i % 2 == 0:
        word = word.upper()
    elems.append('{}: {}'.format(word, wordcount)

print('{' + ', '.join(elems) + '}')

Или вы можете сделать новый OrderedDict с чередующимся регистром ...

dicc_alt_case = OrderedDict((word.upper() if (i % 2 == 0) else word, wordcount)
                            for word, wordcount in dicc.items())
0 голосов
/ 15 ноября 2018

Использование itertools и collections.OrderedDict (для гарантии заказа на Python <3.7) </p>

Настройка

import itertools
from collections import OrderedDict

s = 'Hi I like PYthon i am UsING python'
switcher = itertools.cycle((str.lower, str.upper))
d = OrderedDict()
final = OrderedDict()

Во-первых, создайте OrderedDictionary просто для подсчета вхождений строк в вашем списке (поскольку вы хотите, чтобы совпадения не зависели от регистра на основе вашего вывода):

for word in s.lower().split():
    d.setdefault(word, 0)
    d[word] += 1

Далее, используйте itertools.cycle для вызоваstr.lower или str.upper на ключах и создайте свой окончательный словарь:

for k, v in d.items():
    final[next(switcher)(k)] = v

print(final)

OrderedDict([('hi', 1), ('I', 2), ('like', 1), ('PYTHON', 2), ('am', 1), ('USING', 1)])
...