在不使用set的情况下从嵌套列表中删除重复项

时间:2020-08-03 03:57:11

标签: python python-3.x string list

我有一个列表列表,我想删除每个嵌套列表中的重复项。

Input: [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
Output: [['c', 'p'], ['a'], ['t','p']]

这里的关键是我不能使用set()函数或fromkeys()。

这是我的代码,

ans = []

for i in letters:
    [ans.append([x]) for x in i if x not in ans]

返回

[['c'], ['p'], ['p'], ['a'], ['a'], ['a'], ['t'], ['t'], ['p']]

这不是我想要的。

5 个答案:

答案 0 :(得分:1)

您使用嵌套列表绊倒了自己。需要第二个循环来过滤元素。尽管效率很低,但您可以将尝试写为

ans = []
for i in letters:
    k = []
    for j in i:
        if j not in k:
            k.append(j)
    ans.append(k)

您可以缩短此代码,但不能降低其复杂性。

为此,您可以使用sorteditertools.groupby。这仍然不如哈希表有效,但比线性查找要好(尽管对于短数组来说无关紧要):

ans = [[k for k, _ in groupby(sorted(i))] for i in letters]

答案 1 :(得分:0)

您可以遍历内部列表并检查该字符是否已存在

inputList = [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
result = []

for l in inputList:
    # create a empty list to store intermediate result 
    tmp = []
    # iterate over sublist
    for ch in l:
        if ch not in tmp: tmp.append(ch)
    result.append(tmp)
print(result)

答案 2 :(得分:0)

由于您不能使用set()fromkeys(),因此我建议进行一次普通的循环迭代,每次检查值是否已经存在:

lst = [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]

new_lst = []
for x in lst:
    res = []
    for y in x:
        if y not in res:
            res.append(y)           
    new_lst.append(res)
    
print(new_lst)

理想情况下,new_lst应该是一组。

答案 3 :(得分:0)

list=[['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
ans=[]
for sublist in list:
    temp=[]
    for ch in sublist:
        if ch not in temp:
            temp.append(ch)
    ans.append(temp)
print(ans)

#我认为它应该工作,非常简单,可能会更复杂

答案 4 :(得分:0)

只需忽略字母的每个实例,直到它是最后一个。

  • 对于输入的每个子列表:
    [[...] for sub in input]
  • 将字母存储在子列表的其余部分中:
    [ltr for i, ltr in enumerate(sub) if ltr not in sub[i+1:]]

将其放在一起,您将拥有:

input  = [['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
output = [[ltr for i, ltr in enumerate(sub) if ltr not in sub[i+1:]] for sub in input]
print(output) #[['c', 'p'], ['a'], ['t', 'p']]