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)
答案 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)