【问题标题】:Nested List Comparison嵌套列表比较
【发布时间】:2013-03-21 19:21:28
【问题描述】:

这里是 Python 菜鸟,所以请多多包涵!我有一个如下所示的列表:

bookList = [("Wuthering Heights", "fred"), ("Everville", "fred"), ("Wuthering Heights", "dan")]

我正在尝试编写一个函数,查看每个嵌套列表并查看谁与谁共享书籍,这取决于谁登录。例如,如果 dan 已登录,系统会说“弗雷德也有李子”。

我有一个字典,将用户名设置为键,密码设置为值。

当列表理解涉及任何嵌套时,我有点挣扎,非常感谢您的帮助!

【问题讨论】:

  • 你能提供一个输出的例子吗?我的意思是,如果那是bookListsearch(username, bookList) 是函数,那么search('fred', bookList)search('dan', bookList) 的结果应该是什么?另外我不明白你的字典与用户名作为键的关系是什么......

标签: python list nested list-comprehension


【解决方案1】:

我不认为你现有的数据结构真的适合这个。我要做的是将它预处理成一个字典,其键是用户名,值是书籍集。然后你可以做一个循环或列表理解来比较登录用户和所有其他用户,看看是否有任何共同点。所以:

from collections import defaultdict
bookdict = defaultdict(set)
for book, name in bookList:
    bookdict[name].add(book)
logged_in_user = 'fred'
for person, books in bookdict.items():
    if person == logged_in_user:
        continue
    common = books.intersection(bookdict[logged_in_user])
    if common:
        print '%s also has %s' % (person, ', '.join(common))

【讨论】:

    【解决方案2】:
    def common_books(user):
        user_books = {b for b, u in bookList if u == user}
        for b, u in bookList:
            if b in user_books and u != user:
                print '{0} also has {1}'.format(u,b)
    

    【讨论】:

      【解决方案3】:

      如果您想获取 fred 在列表中的书籍

      filter(lambda x: x[1] == "fred", bookList)
      

      根据 Bakuriu 的评论的另一个版本。

      class Session:
          def __init__(self):
              self.books = ["Wuthering Heights", "Everville"]
              self.username = "fred"
      
      bookList = [("Wuthering Heights", "fred"), ("Everville", "fred"), ("Wuthering Heights", "dan")]
      
      if __name__ == "__main__":
      
          session = Session()
      
          for book in bookList:
              if book[1] != session.username and book[0] in session.books:
                  print "{} also has {}".format(book[1], book[0])
      

      【讨论】:

      • 我相信他想要,给定一个用户名,例如dan,, 获取所有与dan 有共同书籍的用户名。或者至少我是这样解释这句话的:For example, if dan was logged in, the system would say “fred also has plums”.
      • 是的 Bakuriu 是正确的:)对不起,我的解释不是很清楚!
      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多