Как получить значение индекса в списке из подстроки?

Я читаю содержимое текстового файла JSON и пытаюсь получить содержимое определенного индекса в данных.

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

[{ "value": "hello", "name": "janedoe", "istrue": "yes", "number": 5 }]

Консоль каждый раз ничего не возвращает, и я могу напечатать json_list[0], и она вернет все значение {'name': 'janedoe', 'number': 5}.

Я хотел бы использовать подстроку «лань» для поиска в списке и найти совпадение, а затем вернуть индекс этого совпадения.

Я пытался использовать функцию и один лайнер, такой как этот

res = [i for i in json_list if substring in i] 

    with open ('text.txt', 'r') as output_file:
        json_array = json.load(output_file)
        json_list = []
        json_list = [{'name': item['name'].split('.')[0], 'number': item['number']}
    for item in json_array]

    substring = 'doe'
    def index_containing_substring(json_list, substring):
        for i, s in enumerate(json_list):
            if substring in s:   
                return i
        return -1                                                 

Я хотел бы вернуть значение индекса, чтобы затем вызвать этот индекс и использовать его данные.

Не могли бы вы предоставить образец данных в text.txt? Трудно определить, что не так, не видя, с чего вы начинаете.

IronFlare 11.07.2019 21:08

добавил в пост

ubersuperuser 11.07.2019 21:14
json_list = [{'name': item['name'].split('.')[0], 'number': item['number']} for item in json_array] Я запутался, чего вы надеетесь добиться этой строкой. Что это за цикл делает внутри списка?
plum 0 11.07.2019 21:42

Этот цикл и строка находят значения «имя» и «число», которые мне нужно связать друг с другом. Затем он помещает эти значения в переменную json_list. В конце концов я сравню переменную с одной в списке и посмотрю, совпадает ли она, и если да, я вытащу числовое значение и использую его для следующей части моего скрипта.

ubersuperuser 11.07.2019 22:02

Пожалуйста, используйте общий тег [python] для всех вопросов, связанных с python. используйте тег для конкретной версии по своему усмотрению.

juanpa.arrivillaga 11.07.2019 23:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Согласны ли мы с тем, что вы говорите о словарях внутри списка? Насколько я понимаю, вы хотите иметь доступ к индексу следующим образом:

tab = [{ "value": "hello", "name": "janedoe", "istrue": "yes", "number": 5 }]
% Doesn't work
print(tab[0][0]) // You would like "hello"

Однако, если вы знаете, что вам просто нужно «значение», «имя» или что-то еще, вы можете получить доступ следующим образом:

tab = [{ "value": "hello", "name": "janedoe", "istrue": "yes", "number": 5 }]
# Display "hello"
print(tab[0]["value"])

Вы можете использовать цикл, как и вы, и получать поля, которые вы хотите. Это то, что вы хотите?

Обновлено:

Это новый код для того, что вы хотите:

def index_containing_substring(list_dic, substring):
    for i, s in enumerate(json_list):
        for key in s:
            if substring in s[key]:
                # If you don't want the value remove s[key]
                return i, key, s[key]
        return -1

json_list = [
    { "value": "hello", "name": "janedoe", "istrue": "yes", "number": 5 },
    { "value": "hello", "name": "pop", "istrue": "yes", "number": 5 }
]

substring = 'doe'

# display: (0, 'name', 'janedoe')
print(index_containing_substring(json_list, substring))

Я немного изменил, но функция возвращает индекс таблицы и ключ, содержащий «лань». Обратите внимание, что в коде вы просто возвращаете первый элемент, где вы найдете «лань», а не все элементы. Но нетрудно обобщить, если вы хотите получить весь результат.

Я так не думаю... Я хотел бы выполнить поиск в списке с помощью substring='doe' и вернуть индекс элемента, которому он соответствует.

ubersuperuser 11.07.2019 22:51

Хорошо, а эту подстроку "doe" можно найти только в "value" и "name"?

damdamo 11.07.2019 22:56

Подстрока 'doe' будет появляться во всем списке только один раз и только рядом с 'name'.

ubersuperuser 11.07.2019 23:03

Спасибо за решение, в итоге я просто использовал цикл for ниже!

ubersuperuser 12.07.2019 18:16
Ответ принят как подходящий

Я бы просто пошел с простым циклом...

def find_doe_in_list_of_dicts(list_of_dicts):
    for item in list_of_dicts:
        if "doe" in item["name"]:
            index_of_item_with_doe = list_of_dicts.index(item)
            break

    return index_of_item_with_joe

Или в действительно уродливом oneliner:

 def find_doe_in_list_of_dicts(list_of_dicts):
     return list_of_dicts.index([item for item in list_of_dicts if "name" in item and "doe" in item["name"]][0])

Если бы я хотел игнорировать регистр в слове «лань», как бы я это сделал? Вместо жесткого кодирования «лань» я присвоил его переменной с именем sub

ubersuperuser 12.07.2019 20:12

Другие вопросы по теме