Добавьте список диктантов из другого с тем же значением python

#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' его, чтобы он работал.