我有一个csv文件,其中包含操作:
Action Name,Price,Benefit
Action-1,20,5,1.0
Action-2,30,10,3.0
Action-3,50,15,7.5
Action-4,70,20,14.0
Action-5,60,17,10.2
Action-6,80,25,20.0
Action-7,22,7,1.54
Action-8,26,11,2.86我把它转换成一个列表:
rows = []
with open("files/actions_with_benefits.csv", 'r') as file:
csv_reader = csv.reader(file)
header = next(csv_reader)
for row in csv_reader:
rows.append(row)
print("header", header)
print("rows", rows)
rows:
[['Action-1', '20', '5', 1.0], ['Action-2', '30', '10', 3.0], ['Action-3', '50', '15', 7.5], ['Action-4', '70', '20', 14.0], ['Action-5', '60', '17', 10.2], ['Action-6', '80', '25', 20.0], ['Action-7', '22', '7', 1.54], ['Action-8', '26', '11', 2.86], ['Action-9', '48', '13', 6.24], ['Action-10', '34', '27', 9.18], ['Action-11', '42', '17', 7.14]]我最初需要计算我可以用500美元买到的不同动作的所有组合(我只能买其中的一个)。
我使用组合来完成这个任务(我过滤了我的操作列表,创建了一个只包含操作价格的列表,我称之为数字):
target = 500
result = [seq for i in range(len(numbers), 0, -1)
for seq in itertools.combinations(numbers, i)
if sum(seq) == target]但我想知道,如果不过滤其他值,比如示例操作的名称和好处,我就能做到这一点,因为我需要它们。例如,在sort()方法中,您可以使用lambda,它只允许对列表中的一个元素排序,但返回与所有元素排序的列表。
就像我在这个例子中发现的:输入:['rishav',10,'akash',5,'ram',20,'gaurav',15]
def Sort(sub_li):
sub_li.sort(key = lambda x: x[1])
return sub_li
sub_li =[['rishav', 10], ['akash', 5], ['ram', 20], ['gaurav', 15]]
print(Sort(sub_li))
Output : [['akash', 5], ['rishav', 10], ['gaurav', 15], ['ram', 20]]您知道是否有可能在itertools.combinations中做到这一点吗?
提前感谢您的帮助,祝您今天愉快
发布于 2022-03-02 16:38:22
只是一个简单的选择:并行运行两个combinations。可能比将lambda填充到sum中要快(虽然我猜速度不是问题,否则就不会使用蛮力了)
result = [rowseq
for i in range(len(numbers), 0, -1)
for seq, rowseq in zip(
itertools.combinations(numbers, i),
itertools.combinations(rows, i)
)
if sum(seq) == target]https://stackoverflow.com/questions/71325816
复制相似问题