我有一个列表列表,我想删除每个嵌套列表中的重复项。
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']]
这不是我想要的。
答案 0 :(得分:1)
您使用嵌套列表绊倒了自己。需要第二个循环来过滤元素。尽管效率很低,但您可以将尝试写为
ans = []
for i in letters:
k = []
for j in i:
if j not in k:
k.append(j)
ans.append(k)
您可以缩短此代码,但不能降低其复杂性。
为此,您可以使用sorted
和itertools.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']]