Манипулирование списками с индексами

У меня есть два списка.

Список А:

A = ["apple","cherry","pear","mango","banana","grape","kiwi","orange","pineapple"]

Список Б:

B = [{"offset":0, "xx":789},{"offset":3, "xx":921},{"offset":6, "xx":89}]

Идея состоит в том, чтобы использовать смещение от каждого элемента в B в качестве смещения индекса для установки значений xx в нашем массиве результатов. Например, это будет ожидаемый результат:

C=[
{"fruit":"apple","xx":789},
{"fruit":"cherry","xx":789},
{"fruit":"pear","xx":789},
{"fruit":"mango","xx":921},
{"fruit":"banana","xx":921},
{"fruit":"grape","xx":921},
{"fruit":"kiwi","xx":89},
{"fruit":"orange","xx":89},
{"fruit":"pineapple","xx":89},
]

Например, B[0] имеет «смещение» 0. Это означает, что C с индексом >= 0 будет иметь значение «xx» B[0]['xx']. Затем у нас есть B[0]['offset'] из 3, которые будут устанавливать новые значения "xx" для элементов C с индексом >= 3 и так далее.

Я могу добиться аналогичного результата, используя кадры данных и pandas. Но поскольку библиотека pandas довольно тяжелая, меня просят сделать это без использования pandas.

Всегда ли смещения кратны 3? Как вы решили это в пандах?

fsimonjetz 16.02.2023 12:23
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
0
1
79
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Как насчет использования простого цикла?

# rework B in a better format
dic = {d['offset']:d['xx']  for d in B}
# {0: 789, 3: 921, 6: 89}

C = []

v = None
for i, a in enumerate(A):
    v = dic.get(i, v) # if we reached a threshold, update the value
    C.append({'fruit':a, 'xx': v})

print(C)

Выход:

[{'fruit': 'apple', 'xx': 789},
 {'fruit': 'cherry', 'xx': 789},
 {'fruit': 'pear', 'xx': 789},
 {'fruit': 'mango', 'xx': 921},
 {'fruit': 'banana', 'xx': 921},
 {'fruit': 'grape', 'xx': 921},
 {'fruit': 'kiwi', 'xx': 89},
 {'fruit': 'orange', 'xx': 89},
 {'fruit': 'pineapple', 'xx': 89}]

Если структура B должна быть такой, вы можете сделать это:

A = ["apple","cherry","pear","mango","banana","grape","kiwi","orange","pineapple"]
B = [{"offset":0, "xx":789},{"offset":3, "xx":921},{"offset":6, "xx":89}]
C = []
B_iter = 0

for i, fruit in enumerate(A):
    # check if not the last element and next element is start of new range
    if B[B_iter] != B[-1] and B[B_iter+1]["offset"] == i:
        B_iter += 1
    C.append({"fruit": fruit, "xx": B[B_iter]["xx"]})

print(C)

Выход:

[{'fruit': 'apple', 'xx': 789}, 
 {'fruit': 'cherry', 'xx': 789}, 
 {'fruit': 'pear', 'xx': 789}, 
 {'fruit': 'mango', 'xx': 921}, 
 {'fruit': 'banana', 'xx': 921}, 
 {'fruit': 'grape', 'xx': 921}, 
 {'fruit': 'kiwi', 'xx': 89}, 
 {'fruit': 'orange', 'xx': 89}, 
 {'fruit': 'pineapple', 'xx': 89}]

Если смещение всегда кратно 3, вы можете просто выполнить целочисленное деление, чтобы сопоставить фактический индекс со смещением.

A = ["apple","cherry","pear","mango","banana","grape","kiwi","orange","pineapple"]
B = [{"offset": 0, "xx": 789}, {"offset": 3, "xx": 921}, {"offset": 6, "xx": 89}]
C = [{"fruit": fruit,"xx": B[int(idx/3)]["xx"]} for idx, fruit in enumerate(A)]

Выход:

[{'fruit': 'apple', 'xx': 789},
 {'fruit': 'cherry', 'xx': 789}, 
 {'fruit': 'pear', 'xx': 789}, 
 {'fruit': 'mango', 'xx': 921}, 
 {'fruit': 'banana', 'xx': 921},
 {'fruit': 'grape', 'xx': 921},
 {'fruit': 'kiwi', 'xx': 89}, 
 {'fruit': 'orange', 'xx': 89}, 
 {'fruit': 'pineapple', 'xx': 89}]

Другие вопросы по теме