Python: вертикальное объединение двух списков - PullRequest
1 голос
/ 18 апреля 2020

У меня есть два списка одного и того же размера:

A = [1, 1, 2, 2, 3, 3, 4, 5]
B = [a, b, c, d, e, f, g, h]  # numeric values

Как сделать вертикальный биннинг?

Требуемый вывод:

C = [    1,     2,     3, 4, 5]  # len = 5
D = [a + b, c + d, e + f, g, h]  # len = 5

т.е. отображение из A списка к его совокупной сумме (вертикальное разбиение?), где это происходит в списке B.

Ответы [ 4 ]

2 голосов
/ 18 апреля 2020

Это идеальный случай для использования itertools.groupby:

from itertools import groupby
from operator import itemgetter

fst = itemgetter(0)    
A = [1,1,2,2,3,3,4,5]
B = [1,3,4,6,7,7,8,8]

C = []
D = []
for k, v in groupby(zip(A, B), key=fst):
    C.append(k)
    D.append(sum(item[-1] for item in v))

C
>>[1, 2, 3, 4, 5]

D
>>[4, 10, 14, 8, 8]

Если B - это список строк, тогда ваша операция суммирования становится:

D.append(''.join(item[-1] for item in v))
2 голосов
/ 18 апреля 2020

Вы можете использовать словарь и, поскольку Python 3.6 порядок сохраняется, поэтому вы получаете C в качестве ключей и D в качестве значений:

A = [1,1,2,2,3,3,4,5]
B = ["a","b","c","d","e","f","g","h"]

from random import randint
rename_to_B_for_numeric = [randint(0, 255) for _ in A]

result = {}

for idx, item in enumerate(A):
    if item not in result:
        # not sure about the type, so...
        result[item] = "" if isinstance(B[idx], str) else 0
    result[item] += B[idx]

print(result)
# {1: 'ab', 2: 'cd', 3: 'ef', 4: 'g', 5: 'h'}
print(list(result.keys()))
# [1, 2, 3, 4, 5]
print(list(result.values()))
# ['ab', 'cd', 'ef', 'g', 'h']

, очевидно, если тип элемента в B это не строка и не число (в данном случае int), вам нужно немного изменить код, чтобы получить тип по умолчанию. Или просто используйте else:

    if item not in result:
        result[item] = B[idx]
    else:
        result[item] += B[idx]
1 голос
/ 18 апреля 2020

Здесь C - это уникальные значения A:

C = sorted(set(A))

дает:

[1, 2, 3, 4, 5]

Теперь D - вертикальное объединение B с A (если элементы B являются альфа):

D = [''.join(B[i] for i in range(len(B)) if A[i] == j) for j in C]

, если элементы B имеют число:

D = [sum(B[i] for i in range(len(B)) if A[i] == j) for j in C]

:

['ab', 'cd', 'ef', 'g', 'h']

Примечание:

A = [1,1,2,2,3,3,4,5]
B = ['a','b','c','d','e','f','g','h']

Здесь a, b, c, ... если число c, go для второго уравнения:)

1 голос
/ 18 апреля 2020

Я предполагаю, a, b, ... являются числами c переменные:

bins = dict()
for b, x in zip(A,B):
    bins[b] = bins.setdefault(b, 0) + x

C = [key for key in bins]
D = [bins[key] for key in bins]

Если a, b, ... другого типа, вы придется настроить значение по умолчанию в bins.setdefault(b, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...