计算namedtuple列表中名称的出现(名称在嵌套元组中)

时间:2014-10-31 20:46:48

标签: python-2.7 namedtuple

正如标题所说,我试图计算名称元组列表中名称的出现次数,其名称为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

问题是,我只获得了使用此代码的所有作者的列表。我希望它们与年份相关联,所以我可以检查每年独特作者的数量。

2 个答案:

答案 0 :(得分:0)

为了跟踪唯一对象,我喜欢使用setset的行为类似于数学集合,因为它最多可以包含任何给定事物的一个副本。

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相似的结果。我希望它有所帮助。