【问题标题】:Looping over two lists with conditional [closed]有条件地循环两个列表[关闭]
【发布时间】:2017-07-27 20:22:31
【问题描述】:

假设我有两个列表,我想从这两个列表中创建第三个列表,其中将包含第一个列表中的元素元组。本质上,我的代码如下所示:

a = [3,6,7,8,12,89,289] 
b = [28,91,2489]
_max = 39
c = []

我想遍历列表,以便 如果列表 a 中的元素小于列表 b 中的元素列表 b 的项目 - 列表a 的项目 _max,然后我会将元组附加到列表 c

在 python 中执行此操作的最佳方法是什么?我一直在查看zip 函数和类似函数,但还没有看到它的类似用途来完成我想做的事情。

【问题讨论】:

  • 您的list_alist_b 的长度不同。您是否要将第一个元素与第一个元素、第二个元素与第二个元素进行匹配,等等?或者您想将list_a 中的所有内容与list_b 中的所有内容相匹配?
  • 因此,如果我们理解正确,您希望遍历来自 ab 的所有元素对:笛卡尔积。
  • 显示预期的输出。
  • “我想创建第三个列表,其中将包含 第一个列表中的元素元组”这句话与“我想要”的描述之间的关系是无法理解的遍历列表,如果列表 a 中的元素小于列表 b 中的元素和列表 b 的项目 - 列表 a 的项目
  • @J.Doe 将其放入问题中。

标签: python python-3.5


【解决方案1】:

编辑:由于您原始问题的措辞相当不清楚,我假设您想将列表 a 的每个元素与列表 b 的每个元素进行比较。正如 cmets 中所指出的,这种组合称为 笛卡尔积。如果这样的元组满足您的条件,您希望将其添加到您的列表 c。

您可以使用带有条件的列表推导来构建您的列表c

a = [3,6,7,8,12,89,289] 
b = [28,91,2489]

max_value = 39

c=[(item_a, item_b) for item_a in a for item_b in b if (item_a<item_b and item_b-item_a<=max_value)]

或者,您可以使用itertools 创建产品:

import itertools
# ...
c=[(item_a, item_b) for (item_a, item_b) in itertools.product(a, b) if (item_a<item_b and item_b-item_a<=max)]

另外:请不要使用内部名称(如max)作为变量名。

【讨论】:

  • 建议使用for item_a, item_b in itertools.product(a, b)
  • 如何回答一个在需求或问题描述中模棱两可的问题?
  • @nbro 这就是我理解他的问题的方式。它确实写得不好(“第一个列表中的元素元组”),但我认为这就是他的意思。我将编辑我的答案以澄清我的假设。
  • 我建议使用abs(i[1]-i[0])&lt;=max_value 代替(item_a&lt;item_b and item_b-item_a&lt;=max_value)
  • @KHELILIHamza 我认为你的表达不等价,因为 (2,1) 会被接受,尽管 2
【解决方案2】:

itertolols.product怎么样

[i for i in list(itertools.product(a,b)) if abs(i[1]-i[0])<=max_value]

【讨论】:

    【解决方案3】:

    我认为您不需要 zip 功能;只查看元素对 (element_a, element_b),其中 element_a 来自列表 a,element_b 来自列表 b,并且两个元素在列表中具有相同的索引

    您想要的是迭代 所有 对 (element_a, element_b) 其中 element_a 来自列表 a,element_b 来自列表 b。

    这称为列表 a 和列表 b 的笛卡尔积。

    有一个模块(以及许多相关的迭代)——itertools。

    特别是你想要的

    from itertools import product
    product(a, b)
    

    您应该在迭代时使用可能的理解,而不是通过附加来构建答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 2023-03-10
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2021-03-31
      相关资源
      最近更新 更多