所以问题基本上是这样的:我有一个由 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)的第二个位置的数字。
答案 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:因为我不知道你想要更少,更平等或更少的条件所以根据你的需要修改它。