将具有相同后缀的字符串列表分组

时间:2019-07-01 09:18:32

标签: python python-3.x

我有这样的文件夹结构:

exp_name_seed_$INT/$STR_1
exp_name_seed_$INT/$STR_2
exp_name_seed_$INT/$STR_3
exp_name_seed_$INT/$STR_4
exp_name_seed_$INT/$STR_5

exp_name1_seed_$INT/$STR_1
exp_name1_seed_$INT/$STR_2
exp_name1_seed_$INT/$STR_3
exp_name1_seed_$INT/$STR_4
exp_name1_seed_$INT/$STR_5

我想将其归类为结构化数据(例如字典):

-exp_name
-- exp_name_seed_$INT/$STR_1
-- exp_name_seed_$INT/$STR_2
-- exp_name_seed_$INT/$STR_3
-- exp_name_seed_$INT/$STR_4
-- exp_name_seed_$INT/$STR_5
-exp_name1
-- exp_name1_seed_$INT/$STR_1
-- exp_name1_seed_$INT/$STR_2
-- exp_name1_seed_$INT/$STR_3
-- exp_name1_seed_$INT/$STR_4
-- exp_name1_seed_$INT/$STR_5

请注意,此时exp_name的大小可变,但是结尾具有相同的结构_seed_$INT/$STR_1

python中是否有任何有效的方法来实现此功能?

2 个答案:

答案 0 :(得分:3)

因为这样的事情在python中非常容易。 了解功能强大的groupbysetdefault

from itertools import groupby

ls=["exp_name_seed_$INT/$STR_1",
"exp_name_seed_$INT/$STR_2",
"exp_name_seed_$INT/$STR_3",
"exp_name_seed_$INT/$STR_4",
"exp_name_seed_$INT/$STR_5",
"exp_name1_seed_$INT/$STR_1",
"exp_name1_seed_$INT/$STR_2",
"exp_name1_seed_$INT/$STR_3",
"exp_name1_seed_$INT/$STR_4",
"exp_name1_seed_$INT/$STR_5"]

result = {}
for key, val in groupby(ls, lambda s: s.split('_seed_', 1)[0]):
    result.setdefault(key, []).extend(val)

print(result)

发射

{'exp_name': ['exp_name_seed_$INT/$STR_1',
  'exp_name_seed_$INT/$STR_2',
  'exp_name_seed_$INT/$STR_3',
  'exp_name_seed_$INT/$STR_4',
  'exp_name_seed_$INT/$STR_5'],
 'exp_name1': ['exp_name1_seed_$INT/$STR_1',
  'exp_name1_seed_$INT/$STR_2',
  'exp_name1_seed_$INT/$STR_3',
  'exp_name1_seed_$INT/$STR_4',
  'exp_name1_seed_$INT/$STR_5']}

答案 1 :(得分:0)

这是您可以执行此操作的一种方法,即创建一个字典以将数据存储到其中。遍历输入列表,获取所需的子字符串,然后创建字典条目。

ls=["exp_name_seed_$INT/$STR_1",
"exp_name_seed_$INT/$STR_2",
"exp_name_seed_$INT/$STR_3",
"exp_name_seed_$INT/$STR_4",
"exp_name_seed_$INT/$STR_5",
"exp_name1_seed_$INT/$STR_1",
"exp_name1_seed_$INT/$STR_2",
"exp_name1_seed_$INT/$STR_3",
"exp_name1_seed_$INT/$STR_4",
"exp_name1_seed_$INT/$STR_5"]

postfix_len=len("seed_$INT/$STR_N") # assume length is fixed

result_dict={}
for item in ls:
    body_len=len(item)-postfix_len # this length will vary

    body=item[:body_len-1] # get for example "exp_name"
    postfix=item[body_len+5:len(item)] # get for example "$INT/$STR_3"

    if result_dict.get(body):
        result_dict[body].append(postfix) #if entry exists, add to list
    else:
        result_dict[body]=[postfix] # if entry doesn't exist yet, create list


print(result_dict)