如何查找特定行中的某个项目

时间:2013-10-14 21:59:21

标签: python dictionary lookup

我有以下代码读取/打印直接从电子表格中读取的信息行:

in_path = connector.GetWorksheetDataWithId(worksheet_id)

# Simple test print

for item in in_path:
    print item

打印以下格式的多行:

{'_chk2m': 'Name1@domain.com', '_cn6ca': 'PaulDu', '_cokwr': '005C0000003yL'}
{'_chk2m': 'Name2@domain.com', '_cn6ca': 'Jeanell', '_cokwr': '005C0000003we'}
{'_chk2m': 'Name3@domain.com', '_cn6ca': 'Twanna', '_cokwr': '005C0000004tB'}
{'_chk2m': 'Name4@domain.com', '_cn6ca': 'JaneyD', '_cokwr': '005C0000003xJ}
{'_chk2m': 'Name5@domain.com', '_cn6ca': 'Charlot', '_cokwr': '005C0000003yS}
{'_chk2m': 'Name6@domain.com', '_cn6ca': 'Janessa', '_cokwr': '005C0000004pE'}
{'_chk2m': 'Name7@domain.com', '_cn6ca': 'Matilda', '_cokwr': '005C000  0003xK'}
{'_chk2m': 'Name8@domain.com', '_cn6ca': 'ChloeR', '_cokwr': '005C00000040h'}

我试图让用户提交用户别名(行中的第二项,例如'PaulDu')并返回ID#(行中的第3项)

我试过这样的事情:

def dict_test(in_path):
    user_alias = raw_input("Please enter User Alias: ")
    for row in in_path:

        if (user_alias in elt for elt in row):
            return user_alias
            print row

dict_test(in_path)

并输入“PaulDu”但无法成功打印任何行。另外,我如何从现在标识的行中调用电子邮件?


编辑:

最终工作代码:

in_path = connector.GetWorksheetDataWithId(worksheet_id)

def dict_test(in_path):
    user_alias = raw_input("Please enter User Alias: ")
    data = []
    for row in in_path:

        #if any(user_alias in row[elt] for elt in row):
        #if any(user_alias in value for key, value in row.items()):
        if user_alias in row.values():
            print row


    for row in in_path:
        if user_alias == row['_cn6ca']:
                email = row['_chk2m']
                print email
                return email

dict_test(in_path)

3 个答案:

答案 0 :(得分:0)

首先,在你搜索文件之前......

名称in_path表示它是路径名。如果是这样,这一行:

for row in in_path:

...只是循环遍历该路径名的字符,而不是该名称的文件内容。如果您想阅读文件,则必须open。像这样:

with open(in_path) as in_file:
    for row in in_file:

调试此类问题的第一步是print输出中间值。如果您print编辑每个row,那么很明显为什么这不起作用。


接下来,这一行存在一些问题:

if (user_alias in elt for elt in row):

首先,row似乎是dict,这意味着for elt in row会为您提供密钥,但您尝试搜索其值。

其次,当你想检查生成器中的任何元素是否为真时,你正在检查生成器的真值,这总是正确的。为此,请使用any函数。

您可能想要的是类似以下内容之一:

if any(user_alias in row[elt] for elt in row):
if any(user_alias in value for key, value in row.items()):

另外,你真的在​​寻找子串吗?您的示例完全匹配,根据您的描述,这听起来更合理。在这种情况下,你可以写:

if user_alias in row.values():

同时

  

另外,我如何从现在标识的行中调用电子邮件?

嗯,你的代码意味着你不知道密钥,这意味着你唯一可以做的就是浏览找到的行中的值,并启发式地找到一个看起来最像电子邮件地址的那个。

如果 知道密钥,这就容易多了:

if user_alias == row['_cn6ca']:
    email = row['_chk2m']

答案 1 :(得分:0)

in_path的项目是字典吗?在这种情况下,您可以使用字典语法:

def dict_test(in_path):
    user_alias = raw_input("Please enter User Alias: ")
    for row in in_path:
        if row['_cn6ca'] == user_alias:
            print row
            return row['_cokwr']

return会立即退出该功能,因此如果您想要显示某些内容,则必须先放置print

答案 2 :(得分:0)

那样的东西? (返回匹配的行,假设您知道密钥,就可以从中提取所需的任何字段。)

   def dict_test(in_path):
        user_alias = raw_input("Please enter User Alias: ")
        for row in in_path:
            if (row['_cn6ca'] == user_alias ):
                return row

    my_row = dict_test(in_path)
    id = my_row['_cokwr']
    email = my_row['_chk2m']