Python生成一个可从int保存int的列表

Python生成一个可从int保存int的列表,python,iterable,Python,Iterable,完整故事 我有一个namedtuple列表,它本身包含一个tuple和一个字符串,如下所示: 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")

完整故事

我有一个namedtuple列表,它本身包含一个tuple和一个字符串,如下所示:

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")
    ]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
我想通过比较给定元组的值和第一个元组中的值来返回namedtuple

例如

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

我试着查看了
zip
,但这只有在iterables的长度相同时才有效。 我还研究了
itertools.product
,但为此,我需要所有元素都是可移植的

简短问题

我想看看是否有一种方法可以迭代内部元组中的元素,并使其成为一个iterables元组

具体如下:

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")
    ]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
问题是
[3,4]
变成了
[[3,4]]
。这样就只能生产一种产品


我试图避免将每一个
int
都变成一个
列表
非编程方式。

我设法解决了这个问题,如下所示:

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")
    ]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
c
上循环返回
(3,1)
(4,1)

因此,我的完整代码如下:

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")
    ]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]

使用
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')]

那么为什么要匹配
([3,4],1)
元组呢?这里有什么规定?由于第一个元素包含
3
,是否应该匹配?这听起来像是一个递归问题。该列表意味着任何给定值都应该匹配,因此
(3,1)
应该匹配,以及
(4,1)
。这是在表中输入值的简写符号。@TsviM应该
b=(30,6)
匹配
X((范围(25,30),4),“d”)