Поиск элемента в наборе кортежей [дубликат]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

В этом потоке было задано несколько решений. Возможно, самый простой способ - передать объект методу foo() и сохранить результаты в члене этого объекта после завершения асинхронного вызова.

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

26
задан Ashwini Chaudhary 21 January 2015 в 23:00
поделиться

2 ответа

Вы ищете any() :

if any('apple' in code for code in CODES):
    ...

В сочетании с простым выражением генератора это делает задачу. Выражение генератора принимает каждый кортеж и дает True, если оно содержит 'apple'. any() затем возвращает True, когда первый элемент, который он запрашивает, возвращает True (в противном случае False). Следовательно, это делает то, что вы хотите. Он также хорошо читается - , если какой-либо из кортежей содержит 'apple' .

Если вы делаете это много раз и нуждаетесь в производительности, то, возможно, стоит сделать набор всех значений, позволяющих сделать это очень быстро:

cache = set(itertools.chain.from_iterable(CODES)))

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

42
ответ дан Gareth Latty 26 August 2018 в 14:46
поделиться

Вы можете использовать itertools.chain() :

Использование его с in приведет к короткому замыканию, аналогичному any().

In [30]: CODES = (
   ....:     ('apple', 'reddelicious'),
   ....:     ('caramel', 'sweetsticky'),
   ....:     ('banana', 'yellowfruit'),
   ....: )


In [31]: from itertools import chain

In [32]: 'apple' in chain(*CODES)
Out[32]: True

In [33]: 'foo' in chain(*CODES)
Out[33]: False

Для сравнения производительности вы можете проверить мой другой ответ .

7
ответ дан Community 26 August 2018 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: