在列表中查找项的索引值并向列表中追加一个ithem

2024-10-04 01:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

dupes是在列表中找到的重复项的列表。 clipb是原始列表

我现在在clipb中搜索dupes的部分字符串。 一天结束时的目标是在发现的每个重复项的原始列表中添加单词"duplicate"

dupes = ['0138', '0243']
clipb = ['ABC2b_0243D_K6_LOPA-PAST', 'ABC2b_0016G_M1_LOPA-PABR', 'ABC2b_0138H_M1_LOBR-BRMU', 'ABC2b_0138G_J1_LOPA-PAST', 'ABC2b_0243A_O§_STMA-MACV']

def Filter(clipb, dupes):
    return [str for str in clipb if
            any(sub in str for sub in dupes)]
            #index = clipb.index(clipb)  <<--- no idea how to add it in here 
    
rs_found = (Filter(clipb, dupes))
print ("found dupicates from the original list are: ","\n", rs_found)

当前输出只是找到的重复项列表。 从原始列表中找到的重复项包括:

['ABC2b_0243D_K6_LOPA-PAST', 'ABC2b_0138H_M1_LOBR-BRMU', 'ABC2b_0138G_J1_LOPA-PAST', 'ABC2b_0243A_O§_STMA-MACV']

我的问题是,我不知道如何格式化Filter以包括输出找到的重复项的索引,这样我就可以实际更改项目


Tags: in列表filterpastj1foundstrm1
2条回答

不只是过滤掉重复项,因为您希望重复项附加一个tab和“duplicate”,只要在找到重复项时执行此操作,而不是过滤掉它:

clipb = ['ABC2b_0243D_K6_LOPA-PAST', 'ABC2b_0016G_M1_LOPA-PABR', 'ABC2b_0138H_M1_LOBR-BRMU',
         'ABC2b_0138G_J1_LOPA-PAST', 'ABC2b_0243A_O§_STMA-MACV']

seen = set()
final = []
for item in clipb:
    tag = item[6:10]  # assuming tags are always at this index
    if tag in seen:
        item += '\tDUPLICATE'  # or '<space>DUPLCATE', as needed
    else:
        seen.add(tag)
    final.append(item)

print(final)
# Output:
['ABC2b_0243D_K6_LOPA-PAST',
 'ABC2b_0016G_M1_LOPA-PABR',
 'ABC2b_0138H_M1_LOBR-BRMU',
 'ABC2b_0138G_J1_LOPA-PAST\tDUPLICATE',
 'ABC2b_0243A_O§_STMA-MACV\tDUPLICATE']

请注意,您不需要预先创建重复标记的列表-这在代码中完成;模糊地改编自https://docs.python.org/3/library/itertools.htmlunique_everseen配方

你现在的方向很好。这里根本不需要索引!您正在使用any(sub in str for sub in dupes)来检查字符串中是否有任何重复的模式是正确的。您只需要一个小的逻辑细化

当上述条件为真时,会发生什么情况?您想添加"duplicate"字符串。如果不是真的会发生什么?按原样添加原始字符串。因此,只需将列表修改为:

def Filter(clipb, dupes):
    return [s + " duplicate" if any(sub in s for sub in dupes) 
            else s
            for s in clipb]

*注意,我更改了str变量的名称,因为str是内置类型的名称。

样本数据的输出为:

found dupicates from the original list are:  
 ['ABC2b_0243D_K6_LOPA-PAST duplicate', 'ABC2b_0016G_M1_LOPA-PABR', 'ABC2b_0138H_M1_LOBR-BRMU duplicate', 'ABC2b_0138G_J1_LOPA-PAST duplicate', 'ABC2b_0243A_O§_STMA-MACV duplicate']

如果要将原始列表更改到位,可以使用内置的^{}函数迭代索引和项:

for i, s in enumerate(clipb):
    if any(sub in s for sub in dupes):
        clipb[i] = s + " duplicate"

相关问题 更多 >