Проверьте, есть ли список списка в списке [дубликат]

Прежде всего,

У вас может быть много параметров для функции mail () ... У вас может быть 5 макс. mail(to,subject,message,headers,parameters); Что касается переменной $from, которая должна автоматически поступать с вашего веб-хостинга, если вы используете linux cPanel. Он автоматически исходит из вашего имени пользователя и ip-адреса cPanel.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Также убедитесь, что у вас есть правильный порядок переменных в вашей функции mail (). mail($to,$subject,$message,etc.) в этом порядке, иначе есть шанс, что он не сработает. Дайте мне знать, если это поможет ...

11
задан Austin Hastings 13 March 2016 в 00:01
поделиться

11 ответов

Мне нужно проверить, является ли list1 подписок для list2 (True, если любое целое число в списке2, которое является общим с list1, находится в том же порядке индексов, что и в списке1)

Ваш код не работает, потому что, как только элемент списка в ls1 не встречается в ls2, он немедленно вернет False.

Это создает два списка, которые содержат только общие элементы (но в их первоначальный порядок), а затем возвращает True, когда они одинаковы:

def sublist(lst1, lst2):
   ls1 = [element for element in lst1 if element in lst2]
   ls2 = [element for element in lst2 if element in lst1]
   return ls1 == ls2

edit: вариант с эффективностью памяти:

def sublist(ls1, ls2):
    '''
    >>> sublist([], [1,2,3])
    True
    >>> sublist([1,2,3,4], [2,5,3])
    True
    >>> sublist([1,2,3,4], [0,3,2])
    False
    >>> sublist([1,2,3,4], [1,2,5,6,7,8,5,76,4,3])
    False
    '''
    def get_all_in(one, another):
        for element in one:
            if element in another:
                yield element

    for x1, x2 in zip(get_all_in(ls1, ls2), get_all_in(ls2, ls1)):
        if x1 != x2:
            return False

    return True
4
ответ дан L3viathan 22 August 2018 в 09:11
поделиться
  • 1
    Неэффективен в памяти, особенно для больших списков, но, по крайней мере, он учитывает номера каждого :) – Goodies 13 March 2016 в 00:13
  • 2
    @Goodies Добавлена ​​оперативная память: P – L3viathan 13 March 2016 в 02:02
  • 3
    Переменные в функции get_all_in должны быть lst1 и lst2, но это только опечатка. Мне это нравится! Добавление дополнительного ответа. – Goodies 13 March 2016 в 02:07
  • 4
    @Goodies Я не вижу опечатки. – L3viathan 13 March 2016 в 02:46
  • 5
    Может, это плохо. Вы изменили параметры с lst1 на ls1 в первом и втором соответственно. Извиняюсь. – Goodies 13 March 2016 в 02:47

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

def sublist(lst1, lst2):
    return set(lst1) <= set(lst2)
0
ответ дан Arĥimedeς ℳontegasppα ℭacilhας 22 August 2018 в 09:11
поделиться
  • 1
    Правда, но это не отвечает на исходный вопрос. Вам также нужно проверить, находятся ли элементы в одном порядке - и использование наборов не поможет с этим. – Bogd 10 January 2018 в 10:46
  • 2
    Это правда, вы правы. – Arĥimedeς ℳontegasppα ℭacilhας 10 January 2018 в 10:56

Эффективное решение для памяти, основанное на ответе М. Моргана. Принимает во внимание, что для того, чтобы быть подсписком, подсписок должен быть найден в том же порядке в супер-списке.

Переменная k отслеживает длину совпадающих символов. Когда это соответствует длине нашего подсписок, мы можем вернуть true.

Переменная s отслеживает начальное значение. Я отслеживаю это, так что тестовый пример, например sublist(["1", "1", "2"],["0", "1", "1", "1", "2", "1", "2"]) с посторонними повторами первой записи, не влияет на текущий сброс индекса, когда он не имеет аналогов. Как только начальное значение изменяется s, становится неуместным, поэтому этот случай не срабатывает в середине шаблона.

def sublist(sublist, lst):
    if not isinstance(sublist, list):
        raise ValueError("sublist must be a list")
    if not isinstance(lst, list):
        raise ValueError("lst must be a list")

    sublist_len = len(sublist)
    k=0
    s=None

    if (sublist_len > len(lst)):
        return False
    elif (sublist_len == 0):
        return True

    for x in lst:
        if x == sublist[k]:
            if (k == 0): s = x
            elif (x != s): s = None
            k += 1
            if k == sublist_len:
                return True
        elif k > 0 and sublist[k-1] != s:
            k = 0

    return False
2
ответ дан Dave Thomas 22 August 2018 в 09:11
поделиться

Еще один простой способ - использовать понимание list и использовать встроенную функцию all , чтобы убедиться, что все элементы в списке1 содержатся в списке2.

Пример:

list1 = ['1','2']
list2 = ['1','2',3]

all(i in list2 for i in list1)
-1
ответ дан Geislor Crestani 22 August 2018 в 09:11
поделиться
  • 1
    Из очереди просмотра: Могу ли я попросить вас добавить еще какой-нибудь контекст вокруг вашего ответа. Кодовые ответы трудно понять. Это поможет читателю и будущим читателям, если вы сможете добавить дополнительную информацию в свой пост. – help-info.de 19 May 2017 в 17:23
  • 2
    Это краткое, но не учитывает порядок – Davi Lima 24 March 2018 в 23:19

Другой способ, которым мы это делаем, - collections.Counter. Второй ответ L3viathan - самый эффективный и быстрый способ сделать это.

def sublist1(lst1, lst2):
    ls1 = [element for element in lst1 if element in lst2]
    ls2 = [element for element in lst2 if element in lst1]
    return ls1 == ls2


def sublist2(lst1, lst2):
    def get_all_in(one, another):
        for element in one:
            if element in another:
                yield element
    for x1, x2 in zip(get_all_in(lst1, lst2), get_all_in(lst2, lst1)):
        if x1 != x2:
            return False
    return True


def sublist3(lst1, lst2):
    from collections import Counter
    c1 = Counter(lst1)
    c2 = Counter(lst2)
    for item, count in c1.items():
        if count > c2[item]:
            return False
    return True


l1 = ["a", "b", "c", "c", "c", "d", "e"]
l2 = ["c", "a", "c", "b", "c", "c", "d", "d", "f", "e"]

s1 = lambda: sublist1(l1, l2)
s2 = lambda: sublist2(l1, l2)
s3 = lambda: sublist3(l1, l2)

from timeit import Timer
t1, t2, t3 = Timer(s1), Timer(s2), Timer(s3)
print(t1.timeit(number=10000))  # => 0.034193423241588035
print(t2.timeit(number=10000))  # => 0.012621842119714115
print(t3.timeit(number=10000))  # => 0.12714286673722477

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

2
ответ дан Goodies 22 August 2018 в 09:11
поделиться

Я нашел, что все выше всего найдено ['a', 'b', 'd'] как подсловитель ['a', 'b', 'c', 'e', ​​'d'], который может быть неверным, несмотря на то, что все элементы подсписчика присутствуют в списке. Поэтому, чтобы поддерживать порядок, и я придумал:

def sublist4(sublist,lst):
    #Define an temp array to populate 
    sub_list=[]
    comparable_sublist=[]
    #Define two constants to iterate in the while loop
    i=0
    k=0
    #Loop the length of lst
    while i < len(lst):
        #If the element is in the sublist append to temp array, 
        if k < len(sublist) and lst[i] == sublist[k]:
            sub_list.append(lst[i])
            #set a comparable array to the value of temp array
            comparable_sublist = sub_list
            k += 1
            #If the comparable array is the same as the sublist, break
            if len(comparable_sublist) == len(sublist):
                break

        #If the element is not in the sublist, reset temp array
        else:
            sub_list = []


        i += 1

    return comparable_sublist == sublist

Хотя это не очень эффективно для памяти, я нахожу, что он отлично работает с небольшими списками.

1
ответ дан M. Morgan 22 August 2018 в 09:11
поделиться
  • 1
    Вы должны также рассмотреть возможность сброса переменной k. sublist4([1,2,4],[1,2,7,4,1,2,4]) не работает. Вы находитесь на правильном пути с учетом порядка. Глядя на исходный вопрос, апеллятор упомянул, что подписок должен быть в порядке. – Dave Thomas 19 January 2018 в 17:36
def sublist(l1,l2):
    s1=" ".join(str(i) for i in l1)
    s2=" ".join(str(i) for i in l2)
    if s1 in s2:
        return True
    else:
        return False
0
ответ дан Sanjana Mantri 22 August 2018 в 09:11
поделиться
  • 1
    Чтобы ответить на этот вопрос, вы не можете предположить, что списки могут быть преобразованы в строки. Если это так, вы можете использовать l1 in l2 напрямую. – TimZaman 5 February 2018 в 23:31

Легко с итераторами.

>>> a = [0,1,2]
>>> b = [item for item in range(10)]
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[0, 1, 2]
>>> [False, True][set([item in b for item in a]) == set([True])]
True
>>> a = [11, 12, 13]
>>> [False, True][set([item in b for item in a]) == set([True])]
False
1
ответ дан Umair Bhatti 22 August 2018 в 09:11
поделиться
  • 1
    set([item in b for item in a]) = & gt; {item in b for item in a} (более эффективный) – Jean-François Fabre 25 June 2018 в 05:30

Попробуйте это! sublist y не пропускает последовательность списка x.

x = list

y = подписок

if ([i for i,j in enumerate(y) for k,l in enumerate(x) if i == k and j!=l]):
    print("True")
else:
    print("False")
0
ответ дан Vishal Khichadiya 22 August 2018 в 09:11
поделиться
1
ответ дан gehbiszumeis 5 November 2018 в 06:36
поделиться
0
ответ дан Mohan Ram 5 November 2018 в 06:36
поделиться
Другие вопросы по тегам:

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