【问题标题】:Removes duplicates from nested list without use of set从嵌套列表中删除重复项而不使用 set
【发布时间】:2020-08-03 03:57:11
【问题描述】:

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

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']]

这不是我想要的。

【问题讨论】:

  • "我不能使用 set() 函数或 fromkeys()。"为什么不呢?

标签: python python-3.x string list


【解决方案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]

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

      由于您不能使用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 应该是一个集合。

      【讨论】:

        【解决方案4】:
        list=[['c', 'p', 'p'], ['a', 'a', 'a'], ['t', 't', 'p']]
        答案=[]
        对于列表中的子列表:
            温度=[]
            对于子列表中的 ch:
                如果 ch 不在温度范围内:
                    temp.append(ch)
            ans.append(临时)
        打印(答案)

        #我觉得应该可以,很简单,可以更复杂

        【讨论】:

          【解决方案5】:

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

          • 对于每个输入子列表:
            [[...] 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']]
          

          【讨论】:

            猜你喜欢
            • 2016-10-19
            • 1970-01-01
            • 2021-10-15
            • 1970-01-01
            • 1970-01-01
            • 2019-12-07
            • 1970-01-01
            • 2018-02-18
            • 2019-05-04
            相关资源
            最近更新 更多