Проверьте, существует ли элемент в списке списков - PullRequest
0 голосов
/ 17 февраля 2019

Функция group забирает pp из другой большой группы.Я хочу, чтобы программа сообщила, что в rr существуют какие-либо элементы из pp, я хочу отказаться от нее и снова вызвать функцию pick.Если не добавить rr список с pp.

, у меня есть два списка, например:

rr = [[1,2], [3,4], [5,6], [7,8]]
pp = [[7,9], [10, 11]]

, и у меня есть эта функция:

for i in pp:
    for j in i:
        for k in rr:
            for h in k:
                while h == j:
                    pp = group(seq, 2)
    else:
        rr.append(pp)

Здесьrr содержит 7, которые существовали в pp, должны быть отклонены.но проблема в том, что это все-таки принято.и rr все еще добавляется этим неправильным pp.

Если я сделаю так:

for i in pp:
    for j in i:
        for k in rr:
            for h in k:
                while h == j:
                    pp = group(seq, 2)
                rr.append(pp)
    else:
        rr.append(pp)

Он будет работать вечно без вывода.

thisэто мое решение, оно работает, но я не могу выразить это в ответе:

rr1 = [[1,2], [3,4], [5,6], [7,8]]
pp1 = [[7,9], [10, 11]]



# if any(p in rr for p in pp):
#    print("cant append")  #this will send it back to the function to pick up new pp
# elif any((i in p for i in range(len(pp))) in (j in rr for j in range(len(rr))) for p in pp ):
#     print("cant append")
# else:
#      rr.extend(pp)



def is_true(pp , rr):
    for i in pp:
        for j in rr:
            if any(p in j for p in i):
                return False 
    return True



def ext (pp , rr , tt ):
    if tt == True:
        rr.extend(pp)
    else:
        print("cant append")



tt = is_true(pp1, rr1)
ext(pp1, rr1, tt)
print(rr1)

Ответы [ 6 ]

0 голосов
/ 01 апреля 2019

Это мое решение, оно работает:
1- функция группы, которая выбирает элементы в группы:

import random
from students.models import students

pars = students.objects.all()

def groupp (x, y):
    res = random.sample(x, y)
    while len(set([u.first_language for u in res])) < y:
        res = random.sample(x, y)
    return res

2- логика принятия или отказа этой группы, затем отправка результатана вид:

def lession_group (request):
    results=[]
    parr = list(students.objects.all())
    pick = []
    picked = []
    final = []
    for i in range(4):
        pick = groupp (parr, 2)
        while pick in final or pick[::-1] in final or any(p in picked for p in pick):
            pick = groupp (parr, 2)
        final.append(pick)
        picked.extend(pick)
0 голосов
/ 17 февраля 2019

Я подошел так:

def test_element_existed(list1, list2):
    a = set([j for i in range(len(list1)) for j in list1[i]])
    b = set([j for i in range(len(list2)) for j in list2[i]])
    #check if any element in set(a) and set(b) are common and print it
    print(bool(set(a) & set(b)), set(a) & set(b))
    return list(a.union(b) - a.intersection(b))
test_element_existed(rr, pp)

результат:

True {7}
[1, 2, 3, 4, 5, 6, 8, 9, 10, 11]
0 голосов
/ 17 февраля 2019

Здесь другой подход [ Отказ от ответственности : Как и другие, я не совсем уверен, что правильно понял ваш вопрос, пожалуйста, оставьте комментарий, если это не то, что вы хотите].

Еслилюбое значение в rr появляется в pp, также pp не будет добавлено, иначе pp будет добавлено.

rr = [[1,2], [3,4], [5,6], [7,8]]
pp = [[7,9], [10, 11]]
do_append = 1
for rr_sublist in rr:
    for j in range(len(rr_sublist)):
        for pp_sublist in pp:
            for i in range(len(pp_sublist)):
                if pp_sublist[i] == rr_sublist[j]:
                    print("duplicate element found")
                    do_append = 0
if do_append:
    rr.append(pp)
print(rr)

Выход :

duplicate element found
[[1, 2], [3, 4], [5, 6], [7, 8]]
0 голосов
/ 17 февраля 2019

Если вы отмечаете одно целое число из обоих списков списков, вы можете сделать что-то вроде:

from itertools import chain

def are_common_elements(rr, qq):
    return bool(set(chain(*rr))  & set(chain(*qq)))
0 голосов
/ 17 февраля 2019

Я не совсем уверен, что вы ищете.
Но, возможно, это то, с чем вы можете работать:

import itertools

rr = [[1,2], [3,4], [5,6], [7,8]]
pp = [[7,9], [10, 11]]  
result = []
ignore = []

for item in itertools.chain.from_iterable(pp):
    for pair in rr:
        if item in pair:
            print('Yepp, {} is in {}. Ignoring!'.format(item, pair))
            ignore.append(pair)
        elif not pair in result and pair not in ignore:
            result.append(pair)

print('Result: {}'.format(result))

itertools просто сглаживает "контрольный список", так что это прощеработать с числами.Затем просто переберите те, которые и rr пары содержат недопустимые числа.Сохраните эти недопустимые пары в ignore.

Если вы не хотите игнорировать пару, просто пропустите часть игнорирования.
Но он убедится, что [7, 8] не принадлежит вашемурезультаты - если, например, ваш pp выглядел так: pp = [[7,9], [8, 11]]

0 голосов
/ 17 февраля 2019

Я думаю, я знаю, что вы спрашиваете, но я не уверен.Потому что вопрос сформулирован неловко, для меня в любом случае.

Я думаю, что вы хотите использовать наборы.Наборы - это структура данных в python, которая управляет списками уникальных элементов.Похоже, вы хотите, чтобы вещи в rr были только в rr, если они еще не в pp?

Итак, я бы использовал набор для pp. Создайте набор всего в pp:

from itertools import chain
rr = []
pp = [[7,9], [10, 11]]
# create a unique set of elements from the lists in pp
unique_items_in_pp = set(chain(*pp))

def in_pp(items):
    """Takes an iterable, returns bool, True if an element of iterable is in pp"""
    return set(items).isdisjoint(unique_items_in_pp)

# reject anything into rr if in the set
print(list(filter(rr_add, [[1,2], [3,4], [5,6], [7,8]])))

Запуск этого кода:

>>>[[1, 2], [3, 4], [5, 6]]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...