我需要获取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)它似乎只需要一个参数。
任何想法如何检查索引是否是其中任何一个?
答案 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使用集合列表而不是单个集合。