繁体   English   中英

如何从列表中删除相对于另一个列表的重复项?

[英]How to remove duplicates from a list with respect to another list?

我有 2 个列表:

a=[1,1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,5,5,5,5,5]

b=['v1','v2','v2','',
   'v1','v2','v2','',
   'v1','v2','v3','v3','v3','v3',
    'v1','v2',
    'v1','v2','v2','v2','']

两个列表具有相同数量的元素。 我想删除列表 b 中关于包含一组元素的列表 a 的重复项。 例如:列表 a 包含 a=[1,1,1,1,2,2,2,2] 然后对于列表 a 中包含组的元素,我想删除列表 b 中的重复项。

列表 b = ['v1','v2,'v2','','v1','v2','v2','']。 根据两个列表的索引,包含前 4 个元素的列表 b(因为 a 有 [1,1,1,1])有一个重复的 v2。

列表 b 中的下 4 个元素(因为 a 有 [2,2,2,2])根据列表 a 的索引,有 4 个元素有两个重复 v2。

如果有多个 v2/v3,我想用 ''(空字符串)替换以下副本(v2)或(v3),因此 b 的输出应如下所示:

b=['v1','v2','','',
   'v1','v2','','',]

类似的模式预计会出现在 v3 等进一步的副本中。

预期产出

b=['v1','v2','','',
   'v1','v2','','',
   'v1','v2','v3','','','',
    'v1','v2',
    'v1','v2','','','']

我想针对列表 a 中的元素组在列表 b 中进行更改。 因此,如果可以的话,建议任何方法。 也许二维列表 b 相对于列表 a 然后解决问题?

尝试:

from itertools import groupby

out = []
for _, g in groupby(zip(a, b), lambda k: k[0]):
    seen = set()
    for _, v in g:
        if v not in seen:
            out.append(v)
            seen.add(v)
        else:
            out.append("")

print(out)

印刷:

[
    "v1","v2","","",
    "v1","v2","","",
    "v1","v2","v3","","","",
    "v1","v2",
    "v1","v2","","","",
]
a=[1,1,1,1,2,2,2,2,3,3,3,3,3,3,4,4,5,5,5,5,5] b=['v1','v2','v2','', 'v1','v2','v2','', 'v1','v2','v3','v3','v3','v3', 'v1','v2', 'v1','v2','v2','v2',''] hashmap = {1:{}, 2:{}, 3:{}, 4:{}, 5:{}} for entry in enumerate(b): position = entry[0] value = entry[1] row = a[position] if value in hashmap[row]: b[position]='' else: hashmap[row][value] = True

使用lists的另一种尝试:

def group(lst):
    if not lst:
        return []
    out, last, tmp = [], lst[0], [lst[0]]
    for k in lst[1:]:
        if last == k:
            if k in tmp:
                tmp.append((k[0], ''))
            else:
                tmp.append(k)
        else:
            out.append(tmp)
            tmp = [k]
            last = k
    if tmp:
       out.append(tmp)
    return out


a = [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5]

b = [
    'v1', 'v2', 'v2','',
    'v1', 'v2', 'v2','',
    'v1', 'v2', 'v3', 'v3', 'v3', 'v3',
    'v1', 'v2',
    'v1', 'v2', 'v2', 'v2', ''
 ]

groupped = group(list(zip(a, b)))
final =  [j for k in groupped for _,j in k]
print(final)

输出:

[
    'v1', 'v2', '', '',
    'v1', 'v2', '', '',
    'v1', 'v2', 'v3', '', '', '',
    'v1', 'v2',
    'v1', 'v2', '', '', ''
]

另一种切片、设置和排序的方法:

i = 1
c, d = [], []
while a.count(i) > 0:
    c = sorted(set(b[a.index(i):a.index(i) + a.count(i)]))
    if '' in c:
        c.remove('')
    c = list(c) + [''] * (a.count(i) - len(c))
    d += c
    i += 1
b = d

输出,b =

['v1', 'v2', '', '', 
 'v1', 'v2', '', '', 
 'v1', 'v2', 'v3', '', '', '', 
 'v1', 'v2', 
 'v1', 'v2', '', '', '']

暂无
暂无

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

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