假设我有一个叫C的列表。
C = (1,2,3),(4,5,6),(20),(14),(16,17,18,21),(21,22),(22,23),(24,25)
我想将20和14之类的值连接到new_list
中;仅当20和14不出现在(1,2,3),(16,17,18,21)等任何子集中。我不希望加入(21,22),因为(21)已经存在(21), 17,18,21)。我也不想加入(21,22)或(22,23),因为它们重复了。
简而言之,我采用(24,25)&(20)&(14),因为它们在任何子集中都不重复。另外,它们必须少于3个元素。
示例
new_list = (24,25,20,14)
这是我到目前为止尝试过的。
new_list=[];
for a in range(0, len(C)):
#suppose to prevent out of range error
if a <= len(C) -1:
#suppose to check every subset for repeating elements
for b in range(len(C[a+1])):
#again to prevent out of range error
if b <= len(C) - 1:
#using set comparison (this may be a semantic bug)
false_or_true_trip_wire = set(str(C[a])) <= set(C[b])
#I don't want to accidently append a duplicate
I_do_not_want_both_sets_too_equal = set(str(C[a])) != set(C[b])
if false_or_true_trip_wire == 'False':
if I_do_not_want_both_sets_too_equal == 'True':
new_list.append(C[a])
new_list.append(C[b])
输出
当任何子集具有一个元素时发生类型错误。它适用于具有2个或更多元素的子集,例如len()为3的元素。例如(1,2,3)
我正在尝试做的事情之一的示例。
C = (5,6,2),(1,3,4),(4),(3,6,2)
for j in range(0, len(C)):
print(len(C[j]))
示例输出
3
3
Traceback (most recent call last):
File "C:/Users/User/Desktop/come on.py", line 4, in <module>
print(len(C[j]))
TypeError: object of type 'int' has no len()
因此,有什么方法可以创建可以完成我上面示例功能的函数吗?而且,不使用str()?
请为没有上过课的人做一个解释Python,但已经自学了。
如果我可以找到一个函数来摆脱所有这些嵌套循环,将使消除导致错误的语义错误变得更加容易输入错误。任何答案都会有所帮助。
假设我有一个叫C的列表。
C = (1,2,3),(4,5,6),(20),(14),(16,17,18,21),(21,22),(22,23),(24,25)
首先,将您的C
变量分配给tuple
的tuple
和int
对象而不是list
。See this tutorial for more info on these objects.You can also verify this is the case with your own code here.
当任何子集具有一个元素时发生类型错误。它适用于具有2个或更多元素的子集,例如len()为3的元素。例如(1,2,3)
您得到TypeError
,因为单个对象的tuple
实际上不是元组,它只是该对象,因此,如果您在其上调用len
函数,则如果该对象是不是使用TypeError
方法的序列对象。 __len__
对象没有此int
方法,因此当将它们传递到__len__
函数时,会引发TypeError: object of type 'int' has no len()
。在已分配给len
的tuple
中,在索引2 C
和3 int
处有两个这样的(20)
对象。要将它们实际变为(14)
,您需要使用尾部逗号将所谓的“单例”:
tuples
C = (1,2,3),(4,5,6),(20,),(14,),(16,17,18,21),(21,22),(22,23),(24,25)
for j in range(0, len(C)):
# Now that every object in the tuple is another tuple len(C[j]) will work!
print(len(C[j]))
print(type(C[j]))
现在已经不成问题了,我不想假设您要将See it work in python tutor!从C
和tuple
对象的tuple
更改为仅int
对象的tuple
,因此,让我们回到原始的tuple
,看看我们是否可以按照您概述的规则编写一些可以产生预期的C = (1,2,3),(4,5,6),(20),(14),(16,17,18,21),(21,22),(22,23),(24,25)
的代码:
简而言之,我采用(24,25)&(20)&(14),因为它们在任何子集中都不重复。另外,它们必须少于3个元素。
这是我想出的似乎遵循这些规则的代码:
(24,25,20,14)
输出:
C = (1,2,3),(4,5,6),(20),(14),(16,17,18,21),(21,22),(22,23),(24,25)
temp_C = [x if type(x) == tuple else tuple([x]) for x in C]
new_c = []
for i,c in enumerate(temp_C):
l = len(c)
if l <= 2:
temp_b = [
item for j, sub in enumerate(temp_C) for item in sub if i!=j
]
if all(
[y not in temp_b for y in c]
):
[new_c.append(y) for y in c]
new_c = tuple(new_c)
print(new_c)
与(20, 14, 24, 25)
的顺序不同,但它与您今晚为您准备的预期输出一样接近。最终,(24,25,20,14)
希望您逐步了解它的逻辑。