簡體   English   中英

如何對列表中的類似項目進行分組?

[英]How to group similar items in a list?

我希望根據字符串中的前三個字符對列表中的類似項進行分組。 例如:

test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2']

如何根據第一組字母(例如'abc' )將上述列表項分組? 以下是預期輸出:

output = {1: ('abc_1_2', 'abc_2_2'), 2: ('hij_1_1',), 3: ('xyz_1_2', 'xyz_2_2')}

要么

output = [['abc_1_2', 'abc_2_2'], ['hij_1_1'], ['xyz_1_2', 'xyz_2_2']]

我嘗試使用itertools.groupby來完成此操作但沒有成功:

>>> import os, itertools
>>> test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2']
>>> [list(g) for k.split("_")[0], g in itertools.groupby(test)]
[['abc_1_2'], ['abc_2_2'], ['hij_1_1'], ['xyz_1_2'], ['xyz_2_2']]

我查看了以下帖子但沒有成功:

如何合並列表中的類似項目 該示例使用對我的示例過於復雜的方法對類似項目(例如'house''Hose' )進行分組。

如何在Python列表中將等效項組合在一起? 這是我找到列表理解的想法。

.split("_")[0]部分應該在單個參數函數中,作為第二個參數傳遞給itertools.groupby

>>> import os, itertools
>>> test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2']
>>> [list(g) for _, g in itertools.groupby(test, lambda x: x.split('_')[0])]
[['abc_1_2', 'abc_2_2'], ['hij_1_1'], ['xyz_1_2', 'xyz_2_2']]
>>>

將它放在for ...部分中什么都不做,因為結果立即被丟棄。


此外,當您只需要一次拆分時,使用str.partition會稍微有點效率:

[list(g) for _, g in itertools.groupby(test, lambda x: x.partition('_')[0])]

演示:

>>> from timeit import timeit
>>> timeit("'hij_1_1'.split('_')")
1.3149855638076913
>>> timeit("'hij_1_1'.partition('_')")
0.7576401470019234
>>>

這不是一個主要問題,因為這兩種方法在小字符串上都非常快,但我想我會提到它。

暫無
暫無

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

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