【问题标题】:Python make iterable list which holds int from intPython制作可迭代列表,其中包含来自int的int
【发布时间】:2017-09-14 07:33:53
【问题描述】:

全文

我有一个命名元组列表,它本身包含一个元组和一个字符串,如下所示:

a = [
     X((            1,       1), "a"),
     X((            2,       1), "b"),
     X((       [3, 4],       1), "c"),
     X((range(25, 30),       4), "d")
     X((           13, [6, 14]), "e")
    ]

我想通过将给定元组的值与第一个元组中的值进行比较来返回命名元组。

例如。

 b = (1, 1)
 return [x for x in a if a.val == b]

我面临的问题是 b = (3, 1) 它应该返回第三个元组。

我尝试查看zip,但这仅在可迭代对象的长度相同时才有效。 我还查看了itertools.product,但为此我需要让所有元素都可以迭代。

简短的问题

我正在尝试查看是否有一种方法可以迭代内部元组中的元素并使其成为可迭代元组。

如下:

a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)

问题在于[3, 4] 变成了[[3, 4]]。然后只产生一个产品。

我试图避免让每个 int 成为 list 非程序化。

【问题讨论】:

  • 那么为什么要匹配([3, 4], 1) 元组呢?这里有什么规则?是否应该因为第一个元素包含 3 而匹配?这对我来说听起来像是一个递归问题。
  • 该列表暗示任何给定的值都应该匹配,因此(3, 1)(4, 1) 应该匹配。这是在表格中输入值的简写符号。
  • @TsviM,b = (30, 6) 应该匹配 X((range(25, 30), 4), "d") 吗?

标签: python iterable


【解决方案1】:

使用map()any()itertools.product() 函数的简短解决方案:

import collections, itertools

X = collections.namedtuple('X', ['value', 'char'])
a = [
    X((1, 1), "a"),
    X((2, 1), "b"),
    X(([3, 4], 1), "c"),
    X((range(25, 30), 4), "d"),
    X((13, [6, 14]), "e")
]

f = lambda o: (o,) if not isinstance(o, collections.abc.Iterable) else o
b = (26, 4)    # searched tuple
result = [x for x in a if any(i == b for i in itertools.product(*map(f, x.value)))]

print(result)

输出:

[X(value=(range(25, 30), 4), char='d')]

【讨论】:

    【解决方案2】:

    我设法解决了它:

    a = ([3, 4], 1)
    b = ([x] if type(x) is int else x for x in a)
    c = product(*b)
    

    循环遍历c 会返回(3, 1)(4, 1)

    所以我的完整代码如下:

    from itertools import product
    
    def find_matching(requested):
        return [found for found in list_of_tuples if requested in product(
            *([val] if type(val) is int else val for val in found.val))]
    

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 2023-03-07
      • 2019-12-03
      • 2015-04-14
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多