【问题标题】:map if condition and append to list映射 if 条件并附加到列表
【发布时间】:2018-01-18 14:03:36
【问题描述】:

有没有一种简单的方法可以使用 map 函数来编写以下示例?如果没有,如何使用列表推导来完成?

lst1=['a','b','c']
lst2=['a','b','c','d']

l=[]
for iteml1 in lst1:
        if iteml1 in lst2:
            l.append((lst2.index(iteml1),iteml1))

l 是一个向量,包含 lst2 列表和 lst2 元素中 lst1 元素的索引。输出:

l
Out[1]: [(0,'a'),(1,'b'),(2,'c')]

【问题讨论】:

  • 它已经修复了 ;),谢谢纠正。
  • 挑战是用map解决它,列表理解在这个论坛中被广泛解决,以负面的方式给问题评分是没有意义的......
  • 使用map 进行操作,LC 只会使问题听起来像是编码挑战,而不是实际问题。相反,您应该询问在时间、可读性、最佳实践等方面有哪些更好的方法
  • 我同意,下次我会记住的。谢谢

标签: python dictionary if-statement append


【解决方案1】:

您可以从lst2 创建一个字典,将其项目映射到它们的索引,然后使用它来获得预期的输出。这将是O(N)

>>> indices = {x: i for i, x in enumerate(lst2)}    
>>> [(indices[item], item) for item in lst1 if item in indices]
[(0, 'a'), (1, 'b'), (2, 'c')]

另一种选择是获取包含两个列表交集的集合,然后遍历 lst2 并在该集合中进行查找:

>>> s = set(lst2).intersection(lst1)    
>>> [(i, x) for i, x in enumerate(lst2) if x in s]
[(0, 'a'), (1, 'b'), (2, 'c')]

【讨论】:

    【解决方案2】:

    使用地图:

    dict(map(lambda x: (lst2.index(x), x), lst1))
    

    输出

    {0: 'a', 1: 'b', 2: 'c'}
    

    对于dict的输出列表:

    result.items()
    

    【讨论】:

      【解决方案3】:

      根据列表的大小,您可能需要构建一个字典,将lst1 中的项目映射到它们的索引,以避免重复O(n)@ 987654322@ 查找和 O(n) 每个项目的成员资格检查:

      dct = dict((k, v) for v, k in enumerate(lst1))
      l =  [(dct[x], x) for x in lst1 if x in dct]
      print(l)
      # [(0, 'a'), (1, 'b'), (2, 'c')]
      

      成员资格检查和__getitem__ for dicts 都是在恒定时间内完成的。

      【讨论】:

        【解决方案4】:
        l = [(lst2.index(item), item) for item in lst1 if item in lst2]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-26
          • 1970-01-01
          • 2011-05-26
          • 2022-11-17
          • 2021-11-30
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          相关资源
          最近更新 更多