Проверьте, находятся ли элементы одного списка в элементах другого подсписка

#python #string #list #for-loop #substring

Вопрос:

Я использую библиотеку подделок.

 from faker import Faker
fake = Faker()
 

У меня есть список вложенных списков (по 2 элемента в каждом); имя столбца для представления фрейма данных и сам вызов функции.


Список всех имен функций, за исключением имен функций, которые начинаются с»_».:

 my_list = [[m, 'fake.' m '()'] for m in dir(fake) if m[0] != '_']
my_list
>>> [['add_provider', 'fake.add_provider()'],
 ['address', 'fake.address()'], ...
 

Теперь я хочу добавить еще одно условие к тому же для цикла, исключая имена функций.

Попытка Решения:

 exclude = ['add_provider']
fake_cols = [[m, 'fake.' m '()'] for m in dir(fake) if function_name in exclude or function_name[:1] == "_"]
fake_cols
 

Вывод пуст:

 []
 

Мы будем признательны за любые более лаконичные решения.

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

1. Просто избавиться от любого? Это работает?

2. Он по-прежнему включает имя метода «add_provider» в моем списке «исключить». Последний код и вывод выше

3. Есть также что-то странное в [m, 'fake.' m '()' m-это список, не так ли?

4. m — это имя метода

5. итак, мой список точно построен как dir(подделка) ?

Ответ №1:

Возможно, небольшой капитальный ремонт сделал бы это, посмотрите на следующее, если это делает то, к чему вы стремитесь:

 import faker

faker = faker.Faker()

exclude = ["add_provider", "address"]
faker_functions ={}
for function_name in dir(faker):
    if function_name in exclude or function_name[:1] == "_":
        continue
    try:
        faker_functions[function_name] =  getattr(faker, function_name)
    except:
        continue

def get_list_of_fake_functions():
    return list(faker_funcktions.keys())

def get_fake(fake_function):
    return faker_functions[fake_function]()

my_list =  [[key, "faker."  key  "()"] for key in faker_functions.keys()]
my_list
 

Ошибка, как и ожидалось, поскольку исключена:

 get_fake("zipcode_plus4")
KeyError: 'zipcode_plus4'
 

или результат, если нет

 get_fake("zipcode_plus4")
Out[38]: '71875-8723'
 

мой список

 my_list[:10]
Out[57]: 
[['administrative_unit', 'faker.administrative_unit()'],
 ['am_pm', 'faker.am_pm()'], ...
 

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

1.Это дает мне пустоту dict {} . Я не думаю try-catch , что это необходимо. Я думаю, что моя проблема в моих for loop «с if condition «. Я позаботился о том, чтобы мой Faker экземпляр был назван так же, как и ваш.

2. Это не может привести к пустому словарю, я получаю полный список всех функций с приведенным выше кодом

3. Можете ли вы выполнить только мою вырезку и посмотреть, сможете ли вы выполнить get_fake("zipcode_plus4") ?

4. Сейчас получаю результат. Однако это слишком далеко от того, что мне нужно. Мой макет, как описано в посте, — это то, что мне нужно. Я предполагаю, что это как-то связано с моим состоянием «если».

5. Я добавил my_list переменную, это то, что вам нужно?