Значение связано с экземпляром перечисления. Поэтому, чтобы получить доступ к нему без коммутатора, вам нужно сделать getter и сделать его доступным явно. Что-то вроде ниже:
enum Number {
case int(Int)
case float(Float)
func get() -> NSNumber {
switch self {
case .int(let num):
return num
case .float(let num):
return num
}
}
}
var vInteger = Number.int(10)
var vFloat = Number.float(10.5)
println(vInteger.get())
println(vFloat.get())
Возможно, в будущем что-то подобное может быть автоматически создано или более короткое удобство может быть добавлено к языку.
Вы можете создать новый список со списком, используя itertools.groupby :
from itertools import groupby
numbers = [100, 210, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150]
out = [next(group) for key, group in groupby(numbers, key=lambda n: (str(n)[0], len(str(n))))]
print(out)
# [100, 210, 300, 405, 500, 1850, 2120]
Мы группируем с помощью кортежа (первая цифра, длина номера), и сохраните первое число каждой группы, которое мы получаем с next(group)
.
Создайте новый набор, который будет содержать уникальные записи. Затем вы можете фильтровать в соответствии с этим набором:
unique = set()
mylist = [100, 210, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150]
newlist = []
for num in mylist:
num_str = str(num)
length = len(num_str)
first_digit = num_str[0]
if (length, first_digit) in unique:
continue
newlist.append(num)
unique.add((length, first_digit))
>>> newlist
[100, 210, 300, 405, 500, 1850, 2120]
На данный момент вы используете переменную i
в качестве строки в installed_tx_calc
. Однако вы не можете вычесть из строки. Вы действительно хотите использовать i
в качестве индекса и доступа таким образом: installed_tx_calc[i]
. Однако использование индекса может быть сложным, если вы удаляете элементы из списка, поэтому я заменил цикл for циклом while. Кроме того, я бы рекомендовал вам получить доступ к первой цифре напрямую, вместо получения фрагмента. Поэтому ваш код будет выглядеть следующим образом:
i = 1
while i < len(installed_tx_calc):
if len(str(installed_tx_calc[i]) == 3 and str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]:
installed_tx_calc.remove(i)
continue
elif str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]:
installed_tx_calc.remove(i)
continue
i += 1
Имейте в виду, что это сломается, если у вас больше номеров с длиной, не равной 3 или 4. Более расширяемое решение будет:
i = 1
while i < len(installed_tx_calc):
if len(str(installed_tx_calc[i])) == len(str(installed_tx_calc[i-1])) and str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]:
installed_tx_calc.remove(i)
continue
i += 1
Конечной оптимизацией было бы избежать использования remove
в пользу создания нового списка. remove
может быть довольно медленной по сравнению с append
, поэтому следующее будет быстрее, чем предыдущие два решения:
new_itc = []
for i in range(1, len(installed_tx_calc):
if not (len(str(installed_tx_calc[i])) == len(str(installed_tx_calc[i-1])) and str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]):
new_itc.append(installed_tx_calc[i])
Сначала отсортируйте список от низкого значения до большого значения. Проверьте наивысшую базу номера (так что для 350, это 100), и если кратность этой базы (т. Е. 3) не произошла до этого, добавьте это значение в новый список
a_list = [210, 100, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150]
a_list.sort()
new_list = []
base = 1
pre_multiple = 0
for value in a_list:
while (value / base ) >= 10:
base *= 10
multiple = int(value/base)
if multiple != pre_multiple:
new_list.append(value)
pre_multiple = multiple
print(new_list)