检查列表列表中是否存在元素

时间:2019-02-17 14:27:35

标签: python list

group函数从另一个大团体中接过pp。我希望程序说pp中是否存在rr中的任何元素,我想拒绝它并再次调用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包含pp中存在的7个,必须拒绝。但是问题仍然被接受。并且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)

它仍然会永远运行,没有任何输出。

这是我的解决方法,它可以正常工作,但是我不能回答它:

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 :(得分:3)

如果您要从两个列表中检入单个整数,则可以执行以下操作:

from itertools import chain

def are_common_elements(rr, qq):
    return bool(set(chain(*rr))  & set(chain(*qq)))

答案 1 :(得分:0)

我想我知道你在问什么,但我不确定。因为无论如何,对我来说,这个问题措辞尴尬。

我认为您想使用集合。集合是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

的主要好处

答案 2 :(得分:0)

我不确定你要干什么。
但这也许是您可以使用的东西:

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]]

答案 3 :(得分:0)

这是另一种方法[免责声明:由于其他方式,我不太确定我是否正确理解了您的问题,如果不是您想要的,请发表评论。”

如果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]]

答案 4 :(得分:0)

我是这样走的:

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]

答案 5 :(得分:0)

这是我的解决方案,它的工作原理是:
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)