柜台物品分离

Separating items of counter

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', '+']

为什么当我尝试将计数器的值分成两部分(即语言和流行度)时,我得到了一个奇怪的结果?

您需要迭代计数器的 items

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)

输出

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

更新

请注意,您应该使用追加而不是扩展。正如@SpghttCd 指出的那样。

你正在迭代一个字典,这意味着迭代变量将保存每个键。 因此,您的语言是所有 items(即键)的列表,流行度是所有 Counter[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]