#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'}}