python 如何通过对象方法传递元组列表
How to pass list of tuples through a object method in python
遇到这个令人沮丧的问题,我想通过以下列表中的元组
通过我创建的 class 的另一个实例列表上的方法
list_1=[(0, 20), (10, 1), (0, 1), (0, 10), (5, 5), (10, 50)]
instances=[instance[0], instance[1],...instance[n]]
results=[]
pos_list=[]
for i in range(len(list_1)):
a,b=List_1[i]
result=sum(instance.method(a,b) for instance in instances)
results.append(result)
if result>=0:
pos_list.append((a,b))
print(results)
print(pos_list)
问题是所有实例都采用 相同的 元组,而我希望第一个实例上的方法采用第一个元组,依此类推。
如果总和 >0,我最终希望看到它附加到新列表 (pos_list)。
有人知道我如何正确地迭代它吗?
编辑
如果我也打印总和的结果会更清楚。
基本上我希望总和执行如下:
result = instance[0].method(0,20), instance[1].method(10,1), instance[2].method(0,1), instance[3].method(0,10), instance[4].method(5,5), instance[5].method(10,50)
有关信息,该方法只是两个值的 +/- 乘积,具体取决于实例的属性。
所以上面的结果是:
result = [0*20 - 10*1 - 0*1 + 0*10 - 5*5 + 10*50] = [465]
pos_list=[(0, 20), (10, 1), (0, 1), (0, 10), (5, 5), (10, 50)]
除了实际做的是对所有实例使用相同的元组,如下所示:
result = instance[0].method(0,20), instance[1].method(0,20), instance[2].method(0,20), instance[3].method(0,20), instance[4].method(0,20), instance[5].method(0,20)
result = [0*20 - 0*20 - 0*20 + 0*20 - 0*20 + 0*20] = [0]
pos_list=[]
以此类推 (10,1) 等
如何让它像第一个示例一样工作?
您可以使用 zip
来计算您的总和,以生成所有对应实例和元组对。
result=sum(instance.payout(*t) for instance, t in zip(instances, List_1))
zip
会在到达两个迭代器中最短的一个的末尾时立即停止。因此,如果您有 10 个实例和 100 个元组,zip
将只生成 10 对,使用两个列表的前 10 个元素。
我在你的代码中看到的问题是你正在计算 List_1
的每个元素的总和,所以如果 payout
使用相同的输入总是产生相同的结果(例如,它有没有记忆或随机性),result
的值在每次迭代中都是相同的。所以,最终,results
将由相同的值重复多次等于List_1
的长度组成,而pos_list
将包含所有(总和大于0 ) 或输入元组的 none(总和小于或等于零)。
相反,如果 List_1
的项目本身是列表或元组:
List_1 = [
[(0, 1), (2, 3), (4, 5)],
[(6, 7), (8, 9), (10, 11)],
[(12, 13), (14, 15), (16, 17)],
]
因此,在这种情况下,假设您的 class for instances
是这样的:
class Goofy:
def __init__(self, positive_sum=True):
self.positive_sum = positive_sum
def payout(self, *args):
if self.positive_sum:
return sum(args)
else:
return -1 * sum(args)
instances = [Goofy(i) for i in [True, True, False]]
你可以这样重写你的代码:
results=[]
pos_list=[]
for el in List_1:
result = sum(g.payout(*t) for g, t in zip(instances, el))
results.append(result)
if result >= 0:
pos_list.append(el)
运行 之前的代码,results
将是:
[-3, 9, 21]
同时 pop_list
:
[[(6, 7), (8, 9), (10, 11)], [(12, 13), (14, 15), (16, 17)]]
如果您只对 pop_list
感兴趣,您可以将代码压缩成一行:
pop_list = list(filter(lambda el: sum(g.payout(*t) for g, t in zip(instances, el)) > 0, List_1))
非常感谢以上内容!我现在开始工作了。
无法使用 args,因为我的方法有更多的东西,但使用 zip 是让它点击的原因
import random
rand=random.choices(list_1, k=len(instances))
results=[]
pos_list=[]
for r in rand:
x,y=r
result=sum(instance.method(x,y) for instance,(x,y) in zip(instances, rand))
results.append(result)
if result>=0:
pos_list.append(rand)
print(results)
print(pos_list)
例如列表
rand=[(20, 5), (0, 2), (0, 100), (2, 50), (5, 10), (50, 100)]
这个returns下面
results=[147]
pos_list=[(20, 5), (0, 2), (0, 100), (2, 50), (5, 10), (50, 100)]
这正是我想要的。再次感谢!
遇到这个令人沮丧的问题,我想通过以下列表中的元组 通过我创建的 class 的另一个实例列表上的方法
list_1=[(0, 20), (10, 1), (0, 1), (0, 10), (5, 5), (10, 50)]
instances=[instance[0], instance[1],...instance[n]]
results=[]
pos_list=[]
for i in range(len(list_1)):
a,b=List_1[i]
result=sum(instance.method(a,b) for instance in instances)
results.append(result)
if result>=0:
pos_list.append((a,b))
print(results)
print(pos_list)
问题是所有实例都采用 相同的 元组,而我希望第一个实例上的方法采用第一个元组,依此类推。 如果总和 >0,我最终希望看到它附加到新列表 (pos_list)。
有人知道我如何正确地迭代它吗?
编辑 如果我也打印总和的结果会更清楚。
基本上我希望总和执行如下:
result = instance[0].method(0,20), instance[1].method(10,1), instance[2].method(0,1), instance[3].method(0,10), instance[4].method(5,5), instance[5].method(10,50)
有关信息,该方法只是两个值的 +/- 乘积,具体取决于实例的属性。 所以上面的结果是:
result = [0*20 - 10*1 - 0*1 + 0*10 - 5*5 + 10*50] = [465]
pos_list=[(0, 20), (10, 1), (0, 1), (0, 10), (5, 5), (10, 50)]
除了实际做的是对所有实例使用相同的元组,如下所示:
result = instance[0].method(0,20), instance[1].method(0,20), instance[2].method(0,20), instance[3].method(0,20), instance[4].method(0,20), instance[5].method(0,20)
result = [0*20 - 0*20 - 0*20 + 0*20 - 0*20 + 0*20] = [0]
pos_list=[]
以此类推 (10,1) 等
如何让它像第一个示例一样工作?
您可以使用 zip
来计算您的总和,以生成所有对应实例和元组对。
result=sum(instance.payout(*t) for instance, t in zip(instances, List_1))
zip
会在到达两个迭代器中最短的一个的末尾时立即停止。因此,如果您有 10 个实例和 100 个元组,zip
将只生成 10 对,使用两个列表的前 10 个元素。
我在你的代码中看到的问题是你正在计算 List_1
的每个元素的总和,所以如果 payout
使用相同的输入总是产生相同的结果(例如,它有没有记忆或随机性),result
的值在每次迭代中都是相同的。所以,最终,results
将由相同的值重复多次等于List_1
的长度组成,而pos_list
将包含所有(总和大于0 ) 或输入元组的 none(总和小于或等于零)。
相反,如果 List_1
的项目本身是列表或元组:
List_1 = [
[(0, 1), (2, 3), (4, 5)],
[(6, 7), (8, 9), (10, 11)],
[(12, 13), (14, 15), (16, 17)],
]
因此,在这种情况下,假设您的 class for instances
是这样的:
class Goofy:
def __init__(self, positive_sum=True):
self.positive_sum = positive_sum
def payout(self, *args):
if self.positive_sum:
return sum(args)
else:
return -1 * sum(args)
instances = [Goofy(i) for i in [True, True, False]]
你可以这样重写你的代码:
results=[]
pos_list=[]
for el in List_1:
result = sum(g.payout(*t) for g, t in zip(instances, el))
results.append(result)
if result >= 0:
pos_list.append(el)
运行 之前的代码,results
将是:
[-3, 9, 21]
同时 pop_list
:
[[(6, 7), (8, 9), (10, 11)], [(12, 13), (14, 15), (16, 17)]]
如果您只对 pop_list
感兴趣,您可以将代码压缩成一行:
pop_list = list(filter(lambda el: sum(g.payout(*t) for g, t in zip(instances, el)) > 0, List_1))
非常感谢以上内容!我现在开始工作了。 无法使用 args,因为我的方法有更多的东西,但使用 zip 是让它点击的原因
import random
rand=random.choices(list_1, k=len(instances))
results=[]
pos_list=[]
for r in rand:
x,y=r
result=sum(instance.method(x,y) for instance,(x,y) in zip(instances, rand))
results.append(result)
if result>=0:
pos_list.append(rand)
print(results)
print(pos_list)
例如列表
rand=[(20, 5), (0, 2), (0, 100), (2, 50), (5, 10), (50, 100)]
这个returns下面
results=[147]
pos_list=[(20, 5), (0, 2), (0, 100), (2, 50), (5, 10), (50, 100)]
这正是我想要的。再次感谢!