[英]Splitting python list based on regular expression
我有以下python列表:
['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv', 'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv', 'daman_and_diu_2002_aa.csv']
如何將其分為2個列表:
['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv'] and ['daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv', 'daman_and_diu_2002_aa.csv']
這些名單是根據一年之前的字分開的,即2000年......
我知道我應該在python中使用正則表達式,但不知道如何做到這一點。 此外,解決方案需要是可擴展的,而不依賴於實際名稱,例如chattisgarh
這是獲取字典的一種方法,其中對於每個“name”鍵,值是以該名稱開頭的字符串列表,保持原始列表的順序。 這不使用正則表達式,實際上根本不使用任何模塊。 您可以輕松地修改它以創建函數,從每個名稱中刪除尾隨下划線,檢查數據列表中的各種錯誤,從字典中獲取結果列表,等等。
如果您允許其他模塊,或允許更改順序,我相信還有其他方法。
a = ['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv',
'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv',
'daman_and_diu_2002_aa.csv']
names_dict = {}
for item in a:
# Find the first numeric character in the item
for i, c in enumerate(item):
if c.isdigit():
break
# Store the string in the dictionary according to its preceding characters
name = item[:i]
if names_dict.get(name, None):
names_dict[name].append(item)
else:
names_dict[name] = [item]
print(names_dict)
這段代碼的結果(美化)是
{'daman_and_diu_': [
'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv',
'daman_and_diu_2002_aa.csv'],
'chhattisgarh_': [
'chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv']
}
你可以在這里使用itertools.groupby
:
import itertools
import re
list = ['chhattisgarh_2015_aa.csv', 'chhattisgarh_2016_aa.csv',
'daman_and_diu_2000_aa.csv', 'daman_and_diu_2001_aa.csv',
'daman_and_diu_2002_aa.csv']
grouped = itertools.groupby(sorted(list), lambda x: re.match('(.+)_\d{4}', x).group(1))
for (key, values) in grouped:
print(key)
print([x for x in values])
正則表達式(.+)_\\d{4}
匹配一組至少一個字符(我們分組的字符)后跟一個下划線和4個數字。
使用正則表達式結合字典的另一種選擇:
files = ["chhattisgarh_2015_aa.csv", "chhattisgarh_2016_aa.csv", "daman_and_diu_2000_aa.csv", "daman_and_diu_2001_aa.csv", "daman_and_diu_2002_aa.csv"]
import re
from collections import defaultdict
groupedFiles = defaultdict(list)
for fileName in files:
pattern = re.findall("(.*)\\d{4}", fileName)[0]
groupedFiles[pattern].append(fileName)
groupedFiles
{'chhattisgarh_': ['chhattisgarh_2015_aa.csv',
'chhattisgarh_2016_aa.csv'],
'daman_and_diu_': ['daman_and_diu_2000_aa.csv',
'daman_and_diu_2001_aa.csv',
'daman_and_diu_2002_aa.csv']}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.