Удалить номер из списка, если первая цифра и длина одинаковы

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

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

4
задан Fozoro 13 July 2018 в 13:15
поделиться

4 ответа

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

5
ответ дан Thierry Lathuille 17 August 2018 в 12:48
поделиться

Создайте новый набор, который будет содержать уникальные записи. Затем вы можете фильтровать в соответствии с этим набором:

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]
1
ответ дан ÑØØLÌÊ 17 August 2018 в 12:48
поделиться

На данный момент вы используете переменную 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])
1
ответ дан Ben Jones 17 August 2018 в 12:48
поделиться

Сначала отсортируйте список от низкого значения до большого значения. Проверьте наивысшую базу номера (так что для 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)
0
ответ дан Bruno Vermeulen 17 August 2018 в 12:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: