查找字符串的多个变体的索引

时间:2015-04-16 13:35:18

标签: python list indexing

我需要获取csv文件的名字和帐号的索引。

所以有些文件看起来像这样

data = ['account number', 'first name']
or
data = ['account #', 'First Name']
or
data = ['ACCOUNT NUMBER', 'FIRST NAME'] etc.
or
data = ['...',.....,'account num',...,'firstname']

所以从我到目前为止发现的(sackoverflow),我可以使用l.index('first name')来获取索引。同时阅读def(python tutorial)它似乎只需要一个参数。

任何想法如何检查索引是否是其中任何一个?

3 个答案:

答案 0 :(得分:0)

您可以使用列表理解:

idx = [i for i, item in enumerate(data) if item.lower() == 'first name']

或更一般地说:

alist = ['first name', 'first name'] ## or ['account number', 'account #', ...]
idx = [i for i, item in enumerate(data) if item.lower() in alist]

您还可以将正则表达式用于更复杂的情况:

import re
idx = [i for i, item in enumerate(data) if re.search(pattern, item)]

答案 1 :(得分:0)

您可以在列表理解中使用re.match

import re
indices = [i for i,s in enumerate(data) if re.match(r'^(account.*)|(first\s?name)$',s,re.I)]

以下正则表达式:

r'^(account.*)|(first\s?name)$

将匹配任何以account开头的字符串或任何以first开头的字符串和可选的空格name,它还有一个Ignorecase标志,可以忽略你的字符串的情况。

答案 2 :(得分:0)

这是使用套装的一种方法。如果没有字符串匹配字段的选项,则为其索引返回-1,类似于str.find()

#!/usr/bin/env python

accnums = set(['account number', 'account #', 'account num', 'accnum'])
firstnames = set(['first name', 'firstname', '1stname'])

def find_fields(seq):
    accnum, firstname = (-1, -1)
    for i, field in enumerate(seq):
        field = field.lower()
        if field in accnums:
            accnum = i
        elif field in firstnames:
            firstname = i
    return accnum, firstname

testdata = [
    ['account number', 'first name'],
    ['account #', 'First Name'],
    ['ACCOUNT NUMBER', 'FIRST NAME'],
    ['accnum', '1stname'],
    ['country', 'lastname', 'account num', 'account type', 'firstname'],
    ['accnum', '1stname', 'account #'],
    ['albatross', 'first name'],
    ['Account Number', 'duck'],
]

for data in testdata:
    print data, find_fields(data)

<强>输出

['account number', 'first name'] (0, 1)
['account #', 'First Name'] (0, 1)
['ACCOUNT NUMBER', 'FIRST NAME'] (0, 1)
['accnum', '1stname'] (0, 1)
['country', 'lastname', 'account num', 'account type', 'firstname'] (2, 4)
['accnum', '1stname', 'account #'] (2, 1)
['albatross', 'first name'] (-1, 1)
['Account Number', 'duck'] (0, -1)

请注意,如果它找到一个字段的多个匹配条目,则返回 last 匹配字段的索引。因此,对于['accnum', '1stname', 'account #'],它返回2作为帐号字段的索引。

您可以展开if: ... elif:中的find_fields()块以处理具有不同名称的更多字段,但如果您有很多这些字段,那么最好修改逻辑以使其更好; s使用集合列表而不是单个集合。