循环遍历列表,如果列表中的任何索引值的长度<3。则追加到new_list。忽略在其他任何地方重复这些元素的索引

问题描述 投票:0回答:1

假设我有一个叫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,但已经自学了。

  • 如果我可以找到一个函数来摆脱所有这些嵌套循环,将使消除导致错误的语义错误变得更加容易输入错误。任何答案都会有所帮助。

python set comparison nested-loops
1个回答
0
投票

假设我有一个叫C的列表。

C = (1,2,3),(4,5,6),(20),(14),(16,17,18,21),(21,22),(22,23),(24,25)

首先,将您的C变量分配给tupletupleint对象而不是listSee 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()。在已分配给lentuple中,在索引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!Ctuple对象的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)希望您逐步了解它的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.