Умножение списка (X, Y) комбинаций - PullRequest
1 голос
/ 14 мая 2019

Я пытаюсь умножить сгенерированные мной комбинации и создать из них новый список.

Вот что у меня есть:

import pandas as pd
import itertools

data1 = [[0.1],[0.2],[0.3],[0.5]]

df = pd.DataFrame(data1, columns = ['weights'])

for x in combinations(df['weights'], 2):
    print(x)

>>>
(0.1, 0.2)
(0.1, 0.3)
(0.1, 0.5)
(0.2, 0.3)
(0.2, 0.5)
(0.3, 0.5)
##I want to make a new list that shows the product of each combinations,
## example: for every (x,y) combo, do x*y and make a new list called z

Ожидаемый результат должен дать новый список с:

0.02
0.03
0.05
0.06
0.1
0.15

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Вы можете сделать это с помощью простого понимания списка, вам не нужно использовать itertools:

inlist = [(0.1, 0.2),
(0.1, 0.3),
(0.1, 0.5),
(0.2, 0.3),
(0.2, 0.5),
(0.3, 0.5)]

z = [round(elem[0]*elem[1],2) for elem in inlist]
print(z)

Вывод:

[0.02, 0.03, 0.05, 0.06, 0.1, 0.15]

Но, если вы хотитеиспользуйте itertools, вы можете сделать это, используя функцию starmap:

from itertools import starmap
inlist = [(0.1, 0.2),
(0.1, 0.3),
(0.1, 0.5),
(0.2, 0.3),
(0.2, 0.5),
(0.3, 0.5)]

z = list(starmap(lambda i,j: round(i*j,2), inlist))
print(z)

Выход:

[0.02, 0.03, 0.05, 0.06, 0.1, 0.15]
0 голосов
/ 15 мая 2019

Вы можете использовать любую итерацию для создания этих комбинаций.

Если вы новичок в Python, этот ответ попытается прояснить некоторые варианты.

Учитывая

A сокращение функция mul и итерация данных:

def mul(a, b):                                         # 1
    """Return a rounded multiple."""
    return round(a * b, 2)                             


data = [0.1, 0.2, 0.3, 0.5]                            # 2

код

Подготовка итерируемого - линейного контейнераэто может быть зациклено.Примеры:

Вариант 1 - итератор

iterable = it.combinations(data, 2)

Вариант 2 - pandas DataFrame

df = pd.DataFrame(data, columns=["weights"])
iterable = it.combinations(df["weights"], 2)

Демо

[mul(x, y) for x, y in iterable]                      # 3
# [0.02, 0.03, 0.05, 0.06, 0.1, 0.15] 

Подробности

  1. Эта функция содержит операцию, которую вы хотите применить.
  2. Aпростые итерируемые (например, list) данные.Обратите внимание, что он не должен быть вложенным.
  3. Используйте любую итерацию для сокращения пар комбинаций

Вариант 3 - Операции pandas

В качестве альтернативыЕсли у вас есть данные в пандах, вы можете их использовать:

combs = list(it.combinations(data, 2))
df = pd.DataFrame(combs, columns=["a", "b"])
df
#      a    b
# 0  0.1  0.2
# 1  0.1  0.3
# 2  0.1  0.5
# 3  0.2  0.3
# 4  0.2  0.5
# 5  0.3  0.5

df.prod(axis=1).round(2).tolist()
# [0.02, 0.03, 0.05, 0.06, 0.1, 0.15]

Я бы рекомендовал выбрать либо чистый Python, либо pandas (варианты 1 или 3).

...