Предположим, у меня есть список с именем 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
. См. Этот учебник для получения дополнительной информации об этих объектах. Вы также можете проверить это в случае с собственным кодом здесь.
Введите ошибки, когда любой из подмножества имеют один элемент. Это будет работать для подмножеств с 2 или более элементами, такими как элемент с len (), равным 3. Например, (1,2,3)
Вы получаете TypeError
, потому что tuple
из один объект на самом деле не tuple
, это просто объект внутри него. Таким образом, если вы вызываете функцию len
для вложенного объекта, то функция len
будет raise
такой, что TypeError
, если вложенный объект не будет объектом последовательности с методом __len__
.
int
объекты не имеют этого метода __len__
и, таким образом, TypeError: object of type 'int' has no len()
возбуждается, когда они передаются в функцию len
. В tuple
, который вы присвоили C
, у вас есть два таких int
объекта с индексами 2 (20)
и 3 (14)
. Чтобы на самом деле превратить их в tuple
объекты, вам нужно использовать запятую, чтобы сделать так называемый синглтон:
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]))
Смотрите, как это работает в python tutor!
Теперь это не так, я не хочу предполагать, что вы хотите изменить C
с tuple
из tuple
и int
объектов на tuple
из tuple
объекты, поэтому давайте go вернемся к вашему исходному C = (1,2,3),(4,5,6),(20),(14),(16,17,18,21),(21,22),(22,23),(24,25)
и посмотрим, сможем ли мы написать какой-нибудь код, который будет производить что-то вроде вашего ожидаемого (24,25,20,14)
, следуя изложенным вами правилам:
Короче говоря, я Я беру (24, 25) & (20) & (14), потому что они не повторяются ни в одном из подмножеств. Кроме того, они должны иметь менее 3 элементов.
Вот код, который я придумал, который, кажется, следует этим правилам:
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)
, но он настолько близок к вашему ожидаемому результату, насколько я собираюсь получить для вас сегодня вечером. Наконец, вот этот код в python tutor . Надеемся, что логика c станет вам более понятной, когда вы пройдете через нее.