Сортировка по ответу API

#python #json #api #dictionary

#python #json #API #словарь

Вопрос:

Я пытаюсь перебрать ответ API, чтобы показывать только уникальные, неповторяющиеся ip-srcs: и его значение. Мне удалось выяснить, как выполнить вызов на Python и отобразить выходные данные в формате json, но у меня возникли проблемы с фильтрацией словаря, чтобы показывать только ip: src и его значение. Я пробовал разные методы, но безуспешно. Любые предложения

Вот мой исходный код:

 data = '{ "query": " basetypes:(indicator_attribute)  type:\"ip-src\"  timestamp:[now-300d TO now]", "_source_includes": [ "type", "value" ] }'
    
response = requests.post('https://notarealapi.com/api/v4/all/search', headers=headers, 
data=data)
data2 = response.json()

data3 = data2['hits']['hits']
result = {}

for index,item  in enumerate(data3):
  temp = {}
  temp['ip-src'] = item['_source']['value']['ip-src']
  result[index]=temp
print("List of unique ip-srcs:n")
pprint.pprint(result)
 

Вот каков мой ответ api в настоящее время:

  {0: {'ip-src': '193.56.28.103'},
 1: {'ip-src': '62.173.147.175'},
 2: {'ip-src': '194.90.6.2'},
 3: {'ip-src': '103.94.157.5'},
 4: {'ip-src': '62.77.33.18'},
 5: {'ip-src': '23.83.209.13'},
 6: {'ip-src': '89.163.241.193'},
 7: {'ip-src': '62.77.33.18'},
 8: {'ip-src': '80.74.144.29'},
 9: {'ip-src': '240.140.48.116'},
 10: {'ip-src': '159.65.140.182'},
 

Комментарии:

1. Какой результат вы ожидаете?

2. вывод, в котором есть какие-либо повторяющиеся ip-адреса, такие как 62.77.33.18, так что: {0: {‘ip-src’: ‘193.56.28.103’}, 1: {‘ ip-src’: ‘62.173.147.175’}, 2: {‘ ip-src’: ‘194.90.6.2’}, 3: {‘ip-src’: ‘103.94.157.5’}, 4: {‘ ip-src’: ‘62.77.33.18’}, 5: {‘ ip-src’: ‘23.83.209.13’}, 6: {‘ ip-src’: ‘89.163.241.193’}, 7: {‘ ip-src’: ‘80.74.144.29’}, 8: {‘ ip-src’: ‘240.140.48.116’}, 9: {‘ ip-src’: ‘159.65.140.182’},

Ответ №1:

Если я правильно понял ваш вопрос, вам нужен следующий вывод:

 {
 0: '193.56.28.103',
 1: '62.173.147.175'
}
 

В этом случае вы должны сохранить результат (который есть item['_source']['value']['ip-src'] ) в простой переменной, вместо того, чтобы хранить его в другой dict .

Чтобы это работало, ваш цикл должен выглядеть следующим образом:

 for index,item  in enumerate(data3):
  temp = item['_source']['value']['ip-src']
  result[index]=temp
 

Или еще проще, вы могли бы сделать:

 for index,item  in enumerate(data3):
  result[index] = item['_source']['value']['ip-src']
 

Комментарии:

1. Привет! Поэтому я хотел, чтобы на выходе отображались только уникальные значения ip-src, то есть любое значение, которое повторяется более одного раза, не должно включаться в вывод. Например, ip-src: 62.77.33.18′ появляется дважды в строках 4 и 7. Я хочу, чтобы он отображался только один раз в выходных данных вместе с любым другим уникальным значением. Я надеюсь, что это имеет смысл

Ответ №2:

Вы можете сделать это, подсчитав количество вхождений каждого ip-src и распечатав только те, которые встречаются только один раз. Простой способ сделать это — использовать collections.Counter подкласс dictionary для подсчета количества каждого из них, а затем распечатать только те, количество которых равно 1.

 from collections import Counter

data3 =  {0: {'ip-src': '193.56.28.103'},
          1: {'ip-src': '62.173.147.175'},
          2: {'ip-src': '194.90.6.2'},
          3: {'ip-src': '103.94.157.5'},
          4: {'ip-src': '62.77.33.18'},
          5: {'ip-src': '23.83.209.13'},
          6: {'ip-src': '89.163.241.193'},
          7: {'ip-src': '62.77.33.18'},
          8: {'ip-src': '80.74.144.29'},
          9: {'ip-src': '240.140.48.116'},
          10: {'ip-src': '159.65.140.182'},}

counts = Counter(value['ip-src'] for value in data3.values())

print("List of unique ip-srcs:n")
for ip_src, count in counts.items():
    if count == 1:  # Unique?
        print(ip_src)
 

Комментарии:

1. @user12975158: Всегда пожалуйста. Пожалуйста, примите мой ответ, если он решит проблему. Посмотрите, как работает принятие ответа?

Ответ №3:

Вы можете отфильтровать словарь, используя значения внутреннего словаря, чтобы исключить дубликаты. создайте окончательный словарь из отфильтрованных значений:

 data1 = {0: {'ip-src': '193.56.28.103'}, 1: {'ip-src': '62.173.147.175'}, 2: {'ip-src': '194.90.6.2'}, 3: {'ip-src': '103.94.157.5'}, 4: {'ip-src': '62.77.33.18'}, 5: {'ip-src': '23.83.209.13'}, 6: {'ip-src': '89.163.241.193'}, 7: {'ip-src': '62.77.33.18'}, 8: {'ip-src': '80.74.144.29'}, 9: {'ip-src': '240.140.48.116'}, 10: {'ip-src': '159.65.140.182'}}

data2 = [] # list to hold unique values
for k,v in data1.items():
    if v not in data2: #append items that do not already exist in data2 
        data2.append(v)  
final_dict = dict([(data2.index(a),a) for a in data2]) #create a final dictionary
print(final_dict)
 

Вывод

 {0: {'ip-src': '193.56.28.103'},
1: {'ip-src': '62.173.147.175'},
2: {'ip-src': '194.90.6.2'},
3: {'ip-src': '103.94.157.5'},
4: {'ip-src': '62.77.33.18'},
5: {'ip-src': '23.83.209.13'},
6: {'ip-src': '89.163.241.193'},
7: {'ip-src': '80.74.144.29'},
8: {'ip-src': '240.140.48.116'},
9: {'ip-src': '159.65.140.182'}}