微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过python中的对象方法传递元组列表

如何解决如何通过python中的对象方法传递元组列表

遇到这个令人沮丧的问题,我想通过以下列表中的元组 通过我创建的另一个类的实例列表上的方法

list_1=[(0,20),(10,1),(0,10),(5,5),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)

问题是所有实例都采用 same 元组,因为我希望第一个实例上的方法采用第一个元组,依此类推。 如果总和 >0,我最终希望看到它附加到新列表 (pos_list)。

有人知道我如何正确地迭代这个吗?


编辑 如果我也打印总和的结果会更清楚。

基本上我希望总和执行如下:

result = instance[0].method(0,instance[1].method(10,instance[2].method(0,instance[3].method(0,instance[4].method(5,instance[5].method(10,50)

有关信息,该方法只是两个值的 +/- 乘积,具体取决于实例的属性。 因此,上述结果将是:

result = [0*20 - 10*1 - 0*1 + 0*10 - 5*5 + 10*50] = [465]
pos_list=[(0,50)]

除了实际做的是对所有实例使用相同的元组,如下所示:

result = instance[0].method(0,instance[1].method(0,instance[4].method(0,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(总和小于或等于 0)的输入元组。

相反,如果 List_1 的项本身是列表或元组,则更有意义:

List_1 = [
    [(0,1),(2,3),(4,5)],[(6,7),(8,9),(10,11)],[(12,13),(14,15),(16,17)],]

因此,在这种情况下,假设您的 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,el))
    results.append(result)
    if result >= 0:
        pos_list.append(el)

运行前面的代码,results 将是:

[-3,9,21]

虽然pop_list

[[(6,17)]]

如果您只对 pop_list 感兴趣,您可以将代码压缩在一行中:

pop_list = list(filter(lambda el: sum(g.payout(*t) for g,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),100),50),(5,10),(50,100)]

返回以下内容

results=[147]
pos_list=[(20,100)]

正是我想要的。再次感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。