【问题标题】:Python - Tuple generation from listPython - 从列表中生成元组
【发布时间】:2018-04-18 03:47:51
【问题描述】:

我有 2 个列表 a = [2, 6, 12, 13, 1, 4, 5]b = [12, 1]。列表b 中的元素是列表a 的子集。

从上面的一对列表中,我需要创建一个元组列表,如下所示:

[(12,6),(12,2),(1,13),(1,12),(1,6),(1,2)] 

基本上,在列表b 和列表a 的交点,所以从上面例如ab 第一个交点在索引2,值12。因此,使用列表b 中的第一个元素和列表a 中的第二个元素创建一个元组。我正在python中尝试这个,有什么建议可以有效地创建这个元组吗?请注意,每个列表可以包含 100 个元素。

【问题讨论】:

  • 抱歉,我不明白您需要什么...两个列表的交点是什么?
  • @rodrigo,我现在编辑了它。让我知道现在是否清楚?

标签: python list tuples


【解决方案1】:

这个呢:

a = [2, 6, 12, 13, 1, 4, 5]
b = [12, 1]

sum([ [ (bb,aa) for aa in a[0:a.index(bb)]] for bb in b], [])

结果是:

[(12, 2), (12, 6), (1, 2), (1, 6), (1, 12), (1, 13)]

它以原始顺序返回列表,而您的示例返回反向列表。如果这是一个问题,您可以轻松地扭转它们。

【讨论】:

  • 你能告诉我列表理解与嵌套 for 循环有什么不同吗?而这个算法在时间上的效率如何?
  • 列表理解实际上是循环的语法糖。也许还有一些额外的优化机会,但我不会指望它。您可以使用列表生成器来节省内存(使用 () 而不是 [] 的理解,这可能会对非常长的列表产生影响(但不仅仅是 100 个元素)。关于时间差异,您必须个人资料。
【解决方案2】:

我想这就是你想要的:

In [11]: a=[2,6,12,13,1,4,5]

In [12]: b=[12,1]

In [13]: ans=[]

In [14]: for x in b:
    ind=a.index(x)     #find the index of element in a
    for y in a[:ind]:  #iterate up to that index and append the tuple to a new list 
        ans.append((x,y))
   ....:         

In [15]: ans
Out[15]: [(12, 2), (12, 6), (1, 2), (1, 6), (1, 12), (1, 13)]

使用list comprehension:

In [16]: [(x,y) for x in b for y in a[:a.index(x)]]
Out[16]: [(12, 2), (12, 6), (1, 2), (1, 6), (1, 12), (1, 13)]

【讨论】:

  • 预期的输出是正确的,但是寻找更有效的方式 - 没有嵌套 for 循环?
  • @Swati 我还添加了一个基于列表理解的解决方案。
  • 好的,谢谢你,一个问题,因为我的列表 b 将包含列表 a 中的所有元素或元素子集。从列表 a 本身生成输出的任何解决方案。?
  • 我也在问你同样的问题,就像我在上面问过 rodrigo 一样,因为你也提供了相同的基于列表理解的方法:列表理解与嵌套 for 循环有什么不同,我相信它是不仅仅是压缩语法?
  • @Swati 是 O(N^2),但 LC 的运行速度比简单的 for 循环稍快。阅读有关列表理解的更多信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多