Список имеет встроенную функцию .index:
my_list = ['hi', 'babe', 'hi', 'babe', 'key', 'key']
my_list.index('hi')
>>>0
.index выполняет поиск по списку, пока не найдет совпадение и не остановится. Если вам понадобятся индексы большего количества совпадений, вы должны использовать понимание списка. Во-первых, вам может понадобиться преобразовать текст в цифры (списки чисел не нужны), например, hi = 0, babe = 1 и т. Д. Это должно быть сделано (может быть, лучше):
unique_words_list = []
number_list = []
for word in my_list:
if word not in unique_words_list:
unique_words_list.append(word)
for i in range(len(my_list)):
for j in range(len(unique_words_list)):
if my_list[i]==unique_words_list[j]:
number_list.append(j)
unique_words_list, number_list
>>>(['hi', 'babe', 'key'], [0, 1, 0, 1, 2, 2])
Тогда ваше понимание списка:
[i for i, e in enumerate(number_list) if e == 1]
>>>[1,3]
Это означает, что у вас есть «младенец» на 1-й и 3-й позиции в вашем списке.
Возможно, это будет проще! Надеюсь, это поможет.
Так как ID постоянно менялся, я решил пойти другим путем. Я использовал следующий код:
Pattern p = Pattern.compile("\"source\":\"(.*?)\",\"width");
Matcher m = p.matcher(responseSB);
if (m.find()) {
url = m.group(1);
}
p = Pattern.compile("\"title\":(.*?)\",\"thumbnail");
m = p.matcher(responseSB);
if (m.find()) {
description = m.group(1);
}
Вы должны знать, что идентификатор страницы изменится, а миниатюра не обязательна.
// new code
JSONObject incomingJSON = new JSONObject(responseSB);
JSONObject pages = incomingJSON.getJSONObject("query").getJSONObject("pages");
Iterator<String> it = pages.keys();
while(it.hasNext()) {
JSONObject page = pages.getJSONObject(it.next());
String mTitle= page.getString("title");
if(page.keySet().contains("thumbnail")) {
String mUrl= page.getJSONObject("thumbnail").getString("source");
}
}
Если вы заметили JSON, он генерируется случайным образом, но с определенным форматом
Случай 1
{
"batchcomplete": "",
"continue": {
"grncontinue": "0.720220803439|0.720221273467|12887566|0",
"continue": "grncontinue||"
},
"query": {
"pages": {
"4897672": {
"pageid": 4897672,
"ns": 0,
"title": "New Hope, Sunnyvale, Texas"
}
}
}
}
query
и pages
существовал всегда, и на страницах ключ всегда генерируется случайным образом, так что это Map<String, JSONObject>
карта ключа String
и JSONObject
в качестве значения. Затем вам нужно получить значение title
из значений карты
String API = "https://en.wikipedia.org/w/api.php?action=query&generator=random&grnnamespace=0&prop=pageimages&format=json&pithumbsize=500&utf8";
//open connection with wikipedia.
HttpURLConnection httpcon = (HttpURLConnection) new URL(API).openConnection();
//read all the input from wikipedia.
BufferedReader in = new BufferedReader(new InputStreamReader(httpcon.getInputStream()));
String responseSB = in.lines().collect(Collectors.joining());
in.close();
JSONObject incomingJSON = new JSONObject(responseSB);
Map<String,JSONObject> map = (Map<String, JSONObject>) incomingJSON.getJSONObject("query").getJSONObject("pages");
map.forEach((k,v)->System.out.println(" The key is : "+k+" the title is : "+v.getString("title")));
] Случай 2 С источником
{
"batchcomplete": "",
"continue": {
"grncontinue": "0.165621850014|0.165622038679|37982311|0",
"continue": "grncontinue||"
},
"query": {
"pages": {
"57529788": {
"pageid": 57529788,
"ns": 0,
"title": "Model Store",
"thumbnail": {
"source": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Australia_New_South_Wales_relief_location_map.png/500px-Australia_New_South_Wales_relief_location_map.png",
"width": 500,
"height": 443
},
"pageimage": "Australia_New_South_Wales_relief_location_map.png"
}
}
}
}
Так что source
может присутствовать не в каждом ответе, обработайте с помощью try catch
String API = "https://en.wikipedia.org/w/api.php?action=query&generator=random&grnnamespace=0&prop=pageimages&format=json&pithumbsize=500&utf8";
//open connection with wikipedia.
HttpURLConnection httpcon = (HttpURLConnection) new URL(API).openConnection();
//read all the input from wikipedia.
BufferedReader in = new BufferedReader(new InputStreamReader(httpcon.getInputStream()));
String responseSB = in.lines().collect(Collectors.joining());
in.close();
JSONObject incomingJSON = new JSONObject(responseSB);
Map<String,JSONObject> map = (Map<String, JSONObject>) incomingJSON.getJSONObject("query").getJSONObject("pages");
map.forEach((k,v)->{
System.out.println(" The key is : "+k+" the title is : "+v.getString("title"));
//use try catch to get source because you will not get the same response every time
String source = v.getJSONObject("thumbnail").getString("source");
});
}
JSONObject incomingJSON = new JSONObject(responseSB);
JSONObject TitleObjects = incomingJSON.getJSONObject("query");
JSONObject j_Objects_01 = TitleObjects.getJSONObject("pages");
JSONObject j_Objects_02 = j_Objects_01.getJSONObject("38690716");
String mTitle = j_Objects_02.getString("title");
JSONObject j_Objects_03 = j_Objects_02.getJSONObject("thumbnail");
String mUrl = j_Objects_03.getString("source");
Вы не можете получить заголовок и источник напрямую из ответа JSON, потому что он должен содержать несколько внутренних объектов. Ниже приведен фрагмент кода для чтения заголовка и источника.
// new code
JSONObject incomingJSON = new JSONObject(responseSB);
JSONObject innerObject = incomingJSON.getJsonObject("query").getJsonObject("pages").getJsonObject("38690716");
String mTitle= innerObject.getString("title");
String mUrl= innerObject.getJsonObject("thumbnail").getString("source");
//crashes here
String mTitle = incomingJSON.getString("title");
String mUrl = incomingJSON.getString("source");