Python创建可迭代列表,它从int中保存int

时间:2017-09-14 07:33:54

标签: python iterable

完整故事

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

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。

EG。

 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非编程。

2 个答案:

答案 0 :(得分: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')]

答案 1 :(得分:0)

我设法按如下方式解决:

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))]