【问题标题】:Checking if an item is in a list of lists检查项目是否在列表列表中
【发布时间】:2019-02-27 08:16:31
【问题描述】:

我正在制作密码保护程序,并且我有一个预先确定的列表用于测试目的,即:

passwords = [["yahoo","XqffoZeo"],["google","CoIushujSetu"]]

我给用户多种选择。选项 #2 让他们可以选择查找密码

if choice == '2':  # Lookup a password
    print("Which website do you want to lookup the password for?")
    for keyvalue in passwords:
        print(keyvalue[0])
    passwordToLookup = input()

我需要弄清楚的是:

  1. 设置一个循环,使用 FOR 循环遍历列表列表中的所有项目。有人告诉我,考虑列表的最佳方式就像 Excel 电子表格。对于我的密码列表,我从 2 行和 2 列数据开始(不考虑用户可能添加的任何密码)。因此,passwords[0][0] 将等于第 1 行第 1 列中的项目(在我的情况下为“yahoo”)。我被告知要使用 range() 和 len() 的组合,这样我就可以遍历每个“行”,而不管列表有多长。但是,我不确定如何实现。
  2. 一旦我正确设置了 FOR 循环,我需要遍历每个“行”并使用条件逻辑(例如“如果...”)将用户的 passwordToLookup 输入与相应的网站名称进行比较。因为我知道网站名称存储在第一个“列”中,所以它可能看起来像这样:密码[i][0]。但再一次,我所有的尝试都失败了,我需要指导。

【问题讨论】:

  • 如果您正在学习 Python,我建议您以 Python 的方式学习编码,以使您的代码尽可能高效。根据经验,应尽可能避免使用“for”...改用经过优化的原生函数和语句

标签: python python-3.x list loops


【解决方案1】:

使用filter,可以选择列表中的匹配元素。

使用列表推导,选择每个元素的第二个元素(密码)。

passwords = [["yahoo","XqffoZeo"],["google","CoIushujSetu"]]
website_to_lookup = input()
[e[1] for e in filter(lambda i:i[0]==website_to_lookup,passwords)]

如果每个网站有多个密码,请使用切片将其全部返回:[e[1:] for e in filter(lambda i:i[0]==website_to_lookup,passwords)]

【讨论】:

    【解决方案2】:

    Python 让很多事情变得简单,其中之一就是遍历列表(或迭代器)

    假设这是您的列表:

    passwords = [["yahoo","XqffoZeo"],["google","CoIushujSetu"], ['StackOverflow','uesodsiom'], ['Facebook', 'sdhf9wk']]
    

    您可以像这样遍历列表:

    for lst in passwords:
            print(lst)
    ['yahoo', 'XqffoZeo']
    ['google', 'CoIushujSetu']
    ['StackOverflow', 'uesodsiom']
    ['Facebook', 'sdhf9wk']
    

    在这种情况下,您不需要 range 或 len,尽管它们在其他情况下可能很有用。

    如果您只想要嵌套列表中的一个元素,即您的网站,该怎么办?然后你可以索引:

    for lst in passwords:
            print(lst[0])
    
    yahoo
    google
    StackOverflow
    Facebook
    

    如果您想要密码,请使用 lst[1]。索引从 0 开始。

    请注意,列表的结构应保持不变:第一个元素是网站名称,第二个元素是密码。

    现在,据我了解,您想检查给定的网站是否与密码匹配

    第一种方法:

    website = 'Facebook'
    passwordToLookup = 'sdhf9wk'
    
    for lst in passwords:
        if lst[0] == website and lst[1] == passwordToLookup:
            print(True)
    True
    

    解压密码列表中每个元素的第二种方法:

    for websi, password in passwords:
        if websi == website and password == passwordToLookup:
            print(True)
    
    True
    

    开箱示例:

    x, y =  [1, 2]
    print(x)
    1
    print(y)
    2
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2017-12-21
      • 1970-01-01
      • 2021-06-25
      • 2012-06-30
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多