#python #arrays #dictionary #data-structures #append
Вопрос:
Предположил, что у меня есть это :
List of Dict 1
[
{
"name": A
"born": "London"
},
{
"name": B
"born": "Sydney"
...
]
List of Dict 2
[
{
"name": A,
"class": 1,
...
},
{
"name: B,
"class": 2,
...
}
]
Я хочу добавить список диктанта 2 с определенными атрибутами в список диктанта 1, но с минимально возможной временной сложностью.
Подобный этому.
List of Dict 3
[
{
"name": A,
"class": 1,
"born": "London"
...
},
{
"name: B,
"class": 2,
"born": "Sydney
...
}
]
Спасибо вам, ребята
Комментарии:
1. Оба они имеют одинаковую длину, верно?
2. Извините. Атрибуты «имя» в списке диктанта 1-это «имя человека». Но я хочу объединить с одним и тем же значением «имя человека» и «имя».
3. @jizhihaoSAMA Нет. Список диктанта 2 длиннее 1
4. алгоритм снижения сложности. — ??
5. тбх, я сделал это с помощью для … для. Есть какие-нибудь рекомендации, чтобы стать лучше, чем это? @Озу
Ответ №1:
Ты можешь сделать вот так.
Временная сложность: O(Длина D1 * Длина D2)
d1 = [
{
"name": "A",
"born": "London"
},
{
"name": "B",
"born": "Sydney"
}
]
d2 = [
{
"name": "A",
"class": 1,
},
{
"name": "B",
"class": 2,
}
]
d3 = []
for i in d1:
temp = {}
for j in d2:
if i['name'] == j['name']:
temp['name'] = i['name']
temp['class'] = j['class']
temp['born'] = i['born']
d3.append(temp)
print(d3)
[{'name': 'A', 'class': 1, 'born': 'London'}, {'name': 'B', 'class': 2, 'born': 'Sydney'}]
Ответ №2:
Чтобы сделать это без 2 циклов for, вы можете использовать панд, что очень эффективно. Это должно работать очень быстро и для длинных списков.
import pandas as pd
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
df3 = df1.merge(df2, left_on='name', right_on='name', how='left')
#To convert dataframe to a list of dicts
df3 = df3.to_dict('records')
Вы можете выбрать, какие атрибуты добавлять следующим образом:
df3 = df1.merge(df2[['name', 'class']], left_on='name', right_on='name', how='left')
Комментарии:
1. Есть какое-нибудь представление о временной сложности ?
2. извините, d1-это не имя, а имя человека. Можно ли достичь этого с помощью разных имен ?
3. @Axaxaxaxax Я никогда не работал остроумно
pandas
, но я бы попробовалleft_on='person_name'
4. @Matthias да, я уже примерял его. Это сработало. Но у меня есть проблема с ответом на дикт. Ошибка значения: значения с плавающей точкой вне диапазона не соответствуют JSON
5. @Axaxaxaxax Я не уверен, что понимаю. Это сработало, но вы получаете
dict.ValueError
? Вы пытаетесь преобразовать фрейм данных обратно в словарь? Проблема, должно быть, возникла из-за неполных ваших данных. Кроме того, учитывая , что у d1 естьperson_name
, вам нужно изменитьleft_on='person_name'
его, чтобы он работал.