Разделение элементов счетчика - PullRequest
0 голосов
/ 27 октября 2019
with open('data2.csv','r') as data:
    reader = csv.DictReader(data)
    counter = Counter()
    languages =  []
    popularity = []
    for line in reader:
        counter.update(line['\ufeffProgramming language'].split(','))
    for item in counter:
        languages.extend(item[0])
        popularity.extend(item[1])
print(counter)
print(languages)
print(popularity)

Вывод:

Counter({'Java' : 2, 'C++' : 2, 'Python' : 1})
['P', 'J', 'C']
['y', 'a', '+']

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

Ответы [ 2 ]

1 голос
/ 27 октября 2019

вы перебираете dict, что означает, что переменная итерации будет содержать каждый ключ. Таким образом, ваши языки - это список всех items (т.е. ключей), а популярность - это список всех счетчиков [item] (то есть значений):

Пример:

d = {'Java' : 2, 'C++' : 2, 'Python' : 1}

languages = []
popularity = []
for item in d:
        languages.append(item)
        popularity.append(d[item])

# languages
# ['Java', 'C++', 'Python']

# popularity
# [2, 2, 1]
1 голос
/ 27 октября 2019

Вам необходимо выполнить итерацию по элементам счетчика:

for item in counter.items():
    languages.append(item[0])
    popularity.append(item[1])

В настоящее время вы выполняете:

for item in counter:
    languages.extend(item[0])
    popularity.extend(item[1])

Это выполняется только по ключам, поэтомукогда вы делаете item[0], вы получаете первый символ клавиши, это также относится к item[1]. Отсюда вы получаете:

['P', 'J', 'C']
['y', 'a', '+']

Соответствующие первая и вторая буквы ваших ключей. Альтернатива, возможно более pythonic , заключается в использовании zip :

counter = {'Java' : 2, 'C++' : 2, 'Python' : 1}

languages, popularity = zip(*counter.items())

print(languages)
print(popularity)

Output

('Java', 'C++', 'Python')
(2, 2, 1)

Обновление

Обратите внимание, что вы должны использовать добавление вместо удлинения. Как указано @ SpghttCd.

...