根据给定标准消除元组列表中的元组

时间:2018-01-21 00:44:39

标签: python list tuples

所以问题基本上是这样的:我有一个由 n 整数组成的元组列表,如果它们不符合某些标准,则必须将其删除。这个标准归结为元组的每个元素必须等于或小于另一个列表的相应int(让我们在精确的位置调用此列表 f )。

所以,一个例子:

假设我有一个名为 wk 的元组列表,由长度为3的整数元组和一个由3个整数组成的列表 f 组成。像这样:

wk = [(1,3,8),(8,9,1),(1,1,1)]
f = [2,5,8]
=== After applying the function ===
wk_result = [(1,3,8),(1,1,1)]

理由是,当查看 wk ((1,3,8))的第一个元组时,它的第一个元素小于 f <的第一个元素/ strong>即可。 wk 的第二个元素也符合规则,同样适用于第三个元素。这不适用于第二元组,因为第一和第二元素(8和9)大于 f (2和5)的第一和第二元素。

这是我的代码:

for i,z in enumerate(wk):
    for j,k in enumerate(z):
        if k <= f[j]:
            pass
        else:
            del wk[i]

当我运行它时,它不会消除 wk 中的元组。我能做错什么?

修改

用户@James提供的答案之一实际上使得我需要做的事情变得更加简单:

[t for t in wk if t<=tuple(f)]
#returns:
[(1, 3, 8), (1, 1, 1)]

事情就是在我的特殊情况下,它没有完成工作,所以我认为它可能与我将在下面发布的过程的前面步骤有关:

max_i = max(f)
siz = len(f)
flist = [i for i in range(1,max_i +1)]
def cartesian_power(seq, p):
    if p == 0:
        return [()]
    else:
        result = []
        for x1 in seq:
            for x2 in cartesian_power(seq, p - 1):
                result.append((x1,) + x2)
        return result
wk = cartesian_power(flist, siz)
wk = [i for i in wk if i <= tuple(f) and max(i) == max_i]

发生的事情如下:我不能使用itertools库来进行排列,这就是我使用一个完成工作的函数的原因。一旦我生成了包含所有可能排列的元组列表( wk ),我使用两个参数过滤此列表:最初将我带到此处的参数和另一个与讨论无关的参数。

Ill显示带有数字的结果示例,给定f = [2,5,8]

[(1, 1, 8), (1, 2, 8), (1, 3, 8), (1, 4, 8), (1, 5, 8), (1, 6, 8), (1, 7, 8), (1, 8, 1), (1, 8, 2), (1, 8, 3), (1, 8, 4), (1, 8, 5), (1, 8, 6), (1, 8, 7), (1, 8, 8), (2, 1, 8), (2, 2, 8), (2, 3, 8), (2, 4, 8), (2, 5, 8)]

正如您所看到的,有些情况下元组中的整数大于 f 列表中的相应位置,例如(1,6,8)元组的第二个位置(6 )大于 f (5)的第二个位置的数字。

3 个答案:

答案 0 :(得分:2)

您可以使用列表理解来完成此操作。它迭代元组列表并检查元组的所有元素是否小于或等于f中的对应元素。您可以直接比较元组的元素不等式

[t for t in wk if all(x<=y for x,y in zip(t,f)]
# returns:
[(1, 3, 8), (1, 1, 1)]

答案 1 :(得分:2)

对于使用列表readonly压缩的每个元组,您可以将列表理解与(短路)谓词一起使用。

f

这里,wk = [(1, 3, 8), (8, 9, 1), (1, 1, 1), (1, 9, 1)] f = [2, 5, 8] # In this contrived example, f could preferably be a 3-tuple as well. filtered = [t for t in wk if all(a <= b for (a, b) in zip(t, f))] print(filtered) # [(1, 3, 8), (1, 1, 1)] 用于指定一个谓词,即所有元组成员必须小于或等于列表all()中的对应元素;只要其中一个成员未通过元组成员/列表成员f子谓词,all()就会对元组的测试进行短路。

请注意,我添加了一个<=元组,其中第一个元组元素通过了(1, 9, 1)中的子谓词(<=对应元素),而第二个元组元素没有( f)。

答案 2 :(得分:0)

这里没有循环解决方案,它将比较元组中的每个元素:

wk_1 = [(1,3,8),(8,9,1),(1,1,1)]
f = [2,5,8]

final_input=[]



def comparison(wk, target):
    if not wk:
        return 0
    else:
        data=wk[0]
        if data[0]<=target[0] and data[1]<=target[1] and data[2]<=target[2]:
            final_input.append(data)
        comparison(wk[1:],target)


comparison(wk_1,f)

print(final_input)

输出:

[(1, 3, 8), (1, 1, 1)]
P.S:因为我不知道你想要更少,更平等或更少的条件所以根据你的需要修改它。