繁体   English   中英

当子列表重复多次时,如何重命名子列表的元素?

[英]How to rename an element of a sublist when the sublist is repeated several times?

这就是我所拥有的:包含子列表的列表

A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'], ['fname.yaml','0002']]

我想要的是在子列表多次出现时重命名每个子列表的第一个元素。 输出应该是:

[['filename_0.yaml','0001'],['filename_1.yaml','0001'],['filename_2.yaml','0001'], ['fname_0.yaml','0002'], ['fname_1.yaml','0002']]

这是我的代码:

def asso_name_id(A):

for sublist in A:
    if A.count(sublist)>1:
        for i in range(A.count(sublist)):
            base=os.path.splitext(os.path.basename(sublist[0]))[0]
            sublist[0]=base+"_"+str(i)+'.yaml'

这是我得到的这段代码:

[['filename_0_1_2.yaml', '0001'], ['filename_0_1.yaml', '0001'], ['filename.yaml', '0001'], ['fname_0_1.yaml', '0002'], ['fname.yaml', '0002']]

我在做什么错,我该如何解决?

您可以尝试以下方法:

from itertools import chain
A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'], ['fname.yaml','0002']]

flattened = list(chain(*A))

new_dict = {}

for i in A:
    if i[0] not in new_dict:
        new_dict[i[0]] = 1

    else:
        new_dict[i[0]] += 1

final_list = []

for i in A:
    first = i[0].split(".")
    new = first[0]+"_"+str(abs(new_dict[i[0]]-flattened.count(i[0])))
    final_list.append([new+first[1], i[1]])

    new_dict[i[0]] -= 1

print final_list

输出:

[['filename_0yaml', '0001'], ['filename_1yaml', '0001'], ['filename_2yaml', '0001'], ['fname_0yaml', '0002'], ['fname_1yaml', '0002']]

在每个子列表中,您要检查有多少个相同的子列表,然后在同一子列表上重复操作x次。 这就是为什么第二个只做两次的原因,因为第一个不再相同,所以它仅检测到两个相同的子列表。 相反,请尝试以下操作:

#!/usr/bin/python3 
import os
A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'],['fname.yaml','0002']]

def asso_name_id(A):

  for sublist in A
    if A.count(sublist) > 1:
            sublist_name = (sublist[0]+'.')[:-1]
            count = 0
            for s_list in A:
                if s_list[0] == sublist_name:
                        base=os.path.splitext(os.path.basename(s_list[0]))[0]
                        s_list[0]= base+"_"+str(count)+".yaml"
                        count += 1
  return A

print(asso_name_id(A))

输出:

[['filename_0.yaml', '0001'], ['filename_1.yaml', '0001'], ['filename_2.yaml', '0001'], ['fname_0.yaml', '0002'], ['fname_1.yaml', '0002']]
first = map(lambda (first, second): first, A)
second = map(lambda (first, second): second, A)
zip([item for sublist in [map(lambda inc: key + "_" + str(inc), range(value)) for key, value in Counter(first).iteritems()] for item in sublist], second)

不是完整的解决方案。 仍然需要在Yaml上进行字符串拆分。 操作顺序1.仅获取文件名2.仅获取'000X's 3.计算文件名4.为每个文件名创建一个新文件名,名称为_Y,其中Y <=出现次数(使用Counter类)5.邮政编码这与2)

使用列表推导的简单解决方案

import collections
import itertools as IT

A= [['filename.yaml','0001'],['filename.yaml','0001'],['filename.yaml','0001'], ['fname.yaml','0002'], ['fname.yaml','0002']]

counter1 = IT.count(0)
counter2 = IT.count(0)

A = [['filename_{0}.yaml'.format(next(counter1)),sub_list[1]] 
       if sub_list[0]=='filename.yaml' else ['fname_{0}.yaml'.format(next(counter2)),sub_list[1]] 
       for sub_list in A ]

print(A)

输出:

[['filename_0.yaml', '0001'], ['filename_1.yaml', '0001'], ['filename_2.yaml', '0001'], ['fname_0.yaml', '0002'], ['fname_1.yaml', '0002']]

列表理解说明

对于A中的每个列表(sub_list),如果sub_list [0](即sub_list的第一个元素)是“ filename.yaml”,则将其格式化为“ filename_ {0} .yaml”,否则将其格式化为“ fname_ {0} .yaml” ,其中{0}将持有我们的可变计数器。

使用从0开始的计数器,并使用next()递增计数器。

注意:使用两个计数器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM