Нахождение количества списков в кортеже - PullRequest
1 голос
/ 27 марта 2019

У меня есть функция, которая принимает два входа, оба кортежа, и проверяет, чтобы убедиться, что они имеют одинаковый размер, прежде чем продолжить.У меня возникают проблемы при попытке вычислить длину каждого кортежа.

Примеры:

tupA = ([1,2,3,4],[11,22,33,44])
tupB = ([1,2],[3,4],[5,6])
tupC = ([1,2,3,4,5,6,7,8,9])

Когда я беру длину каждого объекта, он возвращает:

len(tupA) = 2
len(tupB) = 3
len(tupC) = 9

Есть ли простой способ вернуть len (tupC) 1?Я нашел обходной путь, добавив запятую:

tupD = ([1,2,3,4,5,6],)
len(tupD) = 1

Но я не хочу заставлять пользователя добавлять запятую.Есть ли лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 27 марта 2019

Для таких данных

tupA = ([1,2,3,4],[11,22,33,44])
tupB = ([1,2],[3,4],[5,6])
tupC = ([1,2,3,4,5,6,7,8,9])

последний не tuple, как вы можете проверить

print(type(tupC)) #prints <class 'list'>

Вы можете проверить, имеет ли переменная заданный тип, используя функцию isinstance, поэтому вы можете создать собственную функцию

def mylen(x):
    if isinstance(x,list):
        return 1
    else:
        return len(x)

Что даст 1 для вашего tupC, 3 для вашего tupB и 2 для вашего tupA.

1 голос
/ 27 марта 2019

Как обсуждалось в комментариях, tupC - это не кортеж, это список из 9 элементов. Это кортеж, только когда есть запятая.

В качестве обходного пути мы можем проверить, является ли он списком, и соответственно вернуть результаты:

def length_(tupl):
    return 1 if isinstance(tupl, list) else len(tupl)

Использование

>>> tupA = ([1,2,3,4],[11,22,33,44])
>>> tupB = ([1,2],[3,4],[5,6])
>>> tupC = ([1,2,3,4,5,6,7,8,9])
>>> length_(tupA)
2
>>> length_(tupB)
3
>>> length_(tupC)
1
1 голос
/ 27 марта 2019

Вам понадобится запятая, чтобы заставить len работать так, как вы ожидаете, как упоминалось в документации

Кортеж с одним элементом создается следующим образом:с запятой.

Единственное преимущество кортежа - сделать его неизменным, но при использовании списков проблем не возникает.

>>> listA = [[1,2,3,4],[11,22,33,44]]
>>> listB = [[1,2],[3,4],[5,6]]
>>> listC = [[1,2,3,4,5,6,7,8,9]]
>>> len(listA)
2
>>> len(listB)
3
>>> len(listC)
1
0 голосов
/ 27 марта 2019

Обратите внимание, что tupC на самом деле является списком, а не кортежем:

>>> tupA = ([1,2,3,4],[11,22,33,44])
>>> tupB = ([1,2],[3,4],[5,6])
>>> tupC = ([1,2,3,4,5,6,7,8,9])
>>> type(tupA), type(tupB), type(tupC)
(<class 'tuple'>, <class 'tuple'>, <class 'list'>)

Если вы по-прежнему настаиваете на том, чтобы вещи были кортежами списков вместо списков списков, и не хотите добавлять запятуюВы можете определить свою собственную функцию для обработки этого:

>>> def newlength(x):
...     if type(x) == list:
...         return 1
...     return len(x)
...
>>> print(newlength(tupA))
2
>>> print(newlength(tupB))
3
>>> print(newlength(tupC))
1

РЕДАКТИРОВАТЬ: Престижность Daweo за избиение меня почти идентичным ответом на пару минут!

...