【问题标题】:Separating items of counter分离计数器项目
【发布时间】:2019-10-27 19:35:02
【问题描述】:
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', '+']

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

【问题讨论】:

  • 您期望的输出到底是什么?
  • for item in counter.items() 不是for item in counter:

标签: python python-3.x csv counter


【解决方案1】:

你需要遍历计数器的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 所指出的那样。

【讨论】:

  • 很好的解释。就个人而言,我会使用for k, v in counter.items() 来附加简单的变量而不是索引元组,但这可能是个人喜好问题。我特别喜欢 zip 变体 - 感谢您回忆起这一点。
  • 一个提示:在我的测试中,extend 确实 notpolularity 工作,错误消息为 TypeError: 'int' object is not iterable - 也许你也应该检查一下。但是,无论如何,IMO append 将是这里选择的更有意义的列表方法。
【解决方案2】:

您正在迭代一个字典,这意味着迭代变量将保存每个键。 因此,您的语言是所有 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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2013-06-21
    • 2018-01-31
    相关资源
    最近更新 更多