簡體   English   中英

python group按字符串匹配模式列出項目

[英]python group list items by string matching pattern

我需要對類似的項目進行分組:

['bty_char_rick_10', 'shd_char_rick_10', 'refl_char_rick_10', 'spec_char_rick_10'], ['bty_char_toby_01', 'shd_char_toby_01'], ['bty_prop_item_01', 'shd_prop_item_01'] ...]

一直在掃描整個互聯網,但無法找到任何有關字符串操作的信息。 應該是一個簡單的fnmatch或字符串匹配,但我不能讓它工作。

from itertools import groupby

lst = ['bty_char_rick_10', 'bty_char_toby_01', 'bty_prop_chair_20', 'bty_prop_item_01', 'bty_prop_vase_10', 'bty_vhcl_tessla_10', 'occ_prop_vase_10', 'refl_char_rick_10', 'refl_prop_vase_10', 'shd_char_rick_10', 'shd_char_toby_01', 'shd_prop_chair_20', 'shd_prop_item_01', 'shd_prop_vase_10', 'shd_vhcl_tessla_10', 'spec_char_rick_10']

keyf = lambda text: text.split('_')[1]+'_'+text.split('_')[2]
print [list(items) for gr, items in groupby(sorted(lst), key=keyf)]

您需要使用相同的鍵對列表進行排序:

[list(g) for k, g in groupby(sorted(lst, key=f), key=f)]

其中f是:

f = lambda x: x.split('_')[1:]

示例

from itertools import groupby

lst = ['bty_char_rick_10', 'bty_char_toby_01', 'bty_prop_chair_20', 'bty_prop_item_01',
       'bty_prop_vase_10', 'bty_vhcl_tessla_10', 'occ_prop_vase_10', 'refl_char_rick_10',
       'refl_prop_vase_10', 'shd_char_rick_10', 'shd_char_toby_01', 'shd_prop_chair_20',
       'shd_prop_item_01', 'shd_prop_vase_10', 'shd_vhcl_tessla_10', 'spec_char_rick_10']

f = lambda x: x.split('_')[1:]    
print([list(g) for k, g in groupby(sorted(lst, key=f), key=f)])

# [['bty_char_rick_10', 'refl_char_rick_10', 'shd_char_rick_10', 'spec_char_rick_10'],
#  ['bty_char_toby_01', 'shd_char_toby_01'],
#  ['bty_prop_chair_20', 'shd_prop_chair_20'],
#  ['bty_prop_item_01', 'shd_prop_item_01'],
#  ['bty_prop_vase_10', 'occ_prop_vase_10', 'refl_prop_vase_10', 'shd_prop_vase_10'],
#  ['bty_vhcl_tessla_10', 'shd_vhcl_tessla_10']]

由於排序,您提出的解決方案是O(nlogn) O(n)解決方案只是使用collections.defaultdict

from collections import defaultdict

lst = ['bty_char_rick_10', 'bty_char_toby_01', 'bty_prop_chair_20', 'bty_prop_item_01',
       'bty_prop_vase_10', 'bty_vhcl_tessla_10', 'occ_prop_vase_10', 'refl_char_rick_10',
       'refl_prop_vase_10', 'shd_char_rick_10', 'shd_char_toby_01', 'shd_prop_chair_20',
       'shd_prop_item_01', 'shd_prop_vase_10', 'shd_vhcl_tessla_10', 'spec_char_rick_10']

d = defaultdict(list)
for string in lst:
    _, key = string.split("_", 1)
    d[key].append(string)

print(list(d.values()))

輸出:

[['bty_char_rick_10', 'refl_char_rick_10', 'shd_char_rick_10', 'spec_char_rick_10'], ['bty_char_toby_01', 'shd_char_toby_01'], ['bty_prop_chair_20', 'shd_prop_chair_20'], ['bty_prop_item_01', 'shd_prop_item_01'], ['bty_prop_vase_10', 'occ_prop_vase_10', 'refl_prop_vase_10', 'shd_prop_vase_10'], ['bty_vhcl_tessla_10', 'shd_vhcl_tessla_10']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM