L oop через список, если какое-либо из значений индекса в списке имеет длину <3. Затем добавьте в new_list. Игнорировать индексы, которые повторяют эти элементы где-либо еще - PullRequest
2 голосов
/ 11 апреля 2020

Предположим, у меня есть список с именем 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) и т. д. c. Я бы не хотел присоединяться (21,22), потому что (21) уже существует в (16,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, но занимался самообучением.

  • Если бы я мог найти функцию, позволяющую избавиться от всех этих вложенных циклов, это бы значительно облегчило избавление от ошибок semanti c, которые вызывают ошибки типов. Любой ответ поможет.

1 Ответ

1 голос
/ 11 апреля 2020

Предположим, у меня есть список с именем 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 станет вам более понятной, когда вы пройдете через нее.

...