正如标题所说,我试图计算名称元组列表中名称的出现次数,其名称为i' m在嵌套元组中查找。 这是学校的一项任务,并给出了很大一部分代码。 列表的结构如下:
paper = namedtuple( 'paper', ['title', 'authors', 'year', 'doi'] )
for (id, paper_info) in Summaries.iteritems():
Summaries[id] = paper( *paper_info )
很容易获得每年独特的标题数量,因为这两个标题都是'和'年'包含一个值,但我无法弄清楚如何计算每年唯一作者的数量。
我不希望你们给我完整的代码或东西,但如果你能给我一个关于这个主题的好教程的链接,这将有很大帮助。 我做了很多谷歌,但我找不到任何有用的信息!
我希望我不要求太多,我第一次在这里问一个问题。
编辑: 感谢到目前为止的回复。这是我现在的代码:
authors = [
auth
for paper in Summaries.itervalues()
for auth in paper.authors
]
authors
问题是,我只获得了使用此代码的所有作者的列表。我希望它们与年份相关联,所以我可以检查每年独特作者的数量。
答案 0 :(得分:0)
为了跟踪唯一对象,我喜欢使用set
。 set
的行为类似于数学集合,因为它最多可以包含任何给定事物的一个副本。
from collections import namedtuple
# by convention, instances of `namedtuple` should be in UpperCamelCase
Paper = namedtuple('paper', ['title', 'authors', 'year', 'doi'])
papers = [
Paper('On Unicorns', ['J. Atwood', 'J. Spolsky'], 2008, 'foo'),
Paper('Discourse', ['J. Atwood', 'R. Ward', 'S. Saffron'], 2012, 'bar'),
Paper('Joel On Software', ['J. Spolsky'], 2000, 'baz')
]
authors = set()
for paper in papers:
authors.update(paper.authors) # "authors = union(authors, paper.authors)"
print(authors)
print(len(authors))
输出:
{'J. Spolsky', 'R. Ward', 'J. Atwood', 'S. Saffron'}
4
更紧凑(但也可能不太可读),您可以通过以下方式构建authors
集:
authors = set([author for paper in papers for author in paper.authors])
如果您拥有大量数据(我还没有检查过),这可能会更快,因为它需要更少的更新操作。
答案 1 :(得分:0)
如果您不想使用嵌入类型set()
并希望了解逻辑,请使用列表和if
分叉。
如果我们在senshin的代码中不使用set()
:
# authors = set()
# for paper in papers:
# authors.update(paper.authors) # "authors = union(authors, paper.authors)"
authors = []
for paper in papers:
for author in paper.authors:
if not author in authors:
authors.append(author)
你可以得到与senshin相似的结果。我希望它有所帮助。