2013-03-21 97 views
0

Python noob在这里所以请忍受我!我有一个看起来像这样的列表:嵌套列表比较

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

我想要做的就是写,着眼于每一个嵌套列表,看到谁共享与谁,谁取决于在登录普通书籍的功能为。例如,如果丹登录,系统会说“fred也有李子”。

我有一个字典设置保存用户名作为密钥和密码作为它们的值。

当他们涉及嵌套的任何东西时,我有点努力与列表理解和帮助将不胜感激!

+0

你能提供输出的一个例子吗?我的意思是,如果这是'bookList'和'search(username,bookList)'是函数,那么'search('fred',bookList)'和'search('dan',bookList) ?此外,我不明白你的字典与用户名作为密钥的关系是什么... – Bakuriu 2013-03-21 19:28:00

回答

2

我不认为你现有的数据结构是真正理想的。我会做的是将它预处理成一个字典,其中的键是用户名,值是书集。然后,您可以执行循环或列表理解,将登录用户与所有其他用户进行比较,并查看是否有任何共同点。所以:

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)) 
+0

这正是我需要的,非常感谢! – user2133344 2013-03-21 20:05:05

-1

如果你试图让弗雷德在列表中

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]) 
+0

我相信他希望给出一个用户名,例如。 'dan',得到所有与'dan'共有书的用户名。或者至少这是我如何解释这个句子:'例如,如果丹登录,系统会说“fred也有李子”。' – Bakuriu 2013-03-21 19:26:45

+0

是的Bakuriu是正确的:)对不起,我的解释不是很清楚! – user2133344 2013-03-21 19:36:58

0
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)