![](/img/trans.png)
[英]How to extract the first instance of a sublist element using a repeated pattern?
[英]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.