Итак, в основном у меня есть список многих точек, и я хочу извлечь только уникальные значения. Я написал функцию, но у меня есть 1 проблема: как не печатать запятую в конце списка?
def unique(list1):
unique_values = []
for u in list1:
if u not in unique_values:
unique_values.append(u)
for u in unique_values:
print(u, end = ", ")
wells = ["U1", "U1", "U3", "U3", "U3", "U5", "U5", "U5", "U7", "U7", "U7", "U7", "U7", "U8", "U8"]
print("The unique values from list are...:", end = " ")
unique(wells)
мой вывод на данный момент: «Уникальные значения из списка...: U1, U3, U5, U7, U8»,
Заменять:
for u in unique_values: print(u, end = ", ")
с питоником:
print(', '.join(unique_values))
Также, как правило, лучший стиль для
return unique_valuesand use
print(', '.join(unique(wells)))
Это может быть излишним, но вы можете использовать NumPy
«уникальный» метод, который, вероятно, более эффективен, особенно для больших массивов или длинных списков.
Подойдет следующий код:
import numpy as np
x = np.array(['a', 'a', 'b', 'c', 'd', 'd'])
y = np.unique(x)
print(', '.join(y))
и результат:
a, b, c, d
Добавлено в Edit: следующее решение работает и для нестроковых списков.
''' Print unique values in a list or numpy array '''
x = [1, 2, 2, 5, 7, 1, 3]
print(x)
# set(x) will return a set of the unique values of x
u = set(x)
print(u)
# remove the curly brackets
str_u = str(u).strip("}{")
print(str_u)
и результат
1, 2, 3, 5, 7
Это решение работает, когда набор значений представляет собой набор или список строк.
Я установил NumPy и все работает как задумано (спасибо!), но ....... как насчет ситуации, когда у меня есть точка, помеченная, например, как U10 или U20, я имею в виду, когда я добавляю точку выборки в список с номер > 10, он занимает позицию 2 в моем списке после печати и т. д., например: U1, U10, U20, U3, U30, U5, U7, U8 Однако мне бы хотелось, чтобы числа шли в «возрастающем» порядке после U, поэтому например: «U1, U3, U5, U7, U8, U10, U20, U30» - это то, что я ожидаю от своего вывода. Как я могу это устроить?
@Triceratops ОП спрашивает о строках, не так ли?
@crtnnn Порядок не сохраняется при поиске уникальных элементов. После этого необходимо повторно отсортировать данные.
@OneCricketeer хорошо. Я думаю, что нашел решение на StackOverflow. Я использовал: sort = sorted(y, key=lambda x: int("".join([i for i in x if i.isdigit()]))) print(*sort, sep = ", ") и теперь мой вывод: U1, US2, U3, U5, U7, U8, U10, U20, U30
@OneCricketeer В его исходном примере да, но я думаю, что лучше представить также более общее решение.
Я бы не назвал numpy общим решением. ','.join(set(map(str, x)))
работает со списком чисел. Не используйте замену строки
надеюсь, приведенные ниже изменения помогут вам :)
def unique(list1):
unique_values = []
for u in list1:
if u not in unique_values:
unique_values.append(u)
return unique_values
wells = ["U1", "U1", "U3", "U3", "U3", "U5", "U5", "U5", "U7", "U7", "U7", "U7", "U7", "U8", "U8"]
req = unique(wells)
# prints in list format
print(f"The unique values from list are...: {req}")
# prints in string format
print(f"The unique values from list are...: {' '.join(req)}")
или уникальные значения также можно узнать с помощью set(wells)
Здесь есть пара проблем: конечный ,
, как указано в вопросе, проверка членства на несортированном list
. Используйте str.join()
для обработки завершающей запятой и даже не пытайтесь отслеживать уникальные значения и проверять, не было ли уже замечено новое значение, просто приведите к set
.
def unique(list1):
unique_values = set(list1)
print(', '.join(sorted(unique_values)))
wells = ["U1", "U1", "U3", "U3", "U3", "U5", "U5", "U5", "U7", "U7", "U7", "U7", "U7", "U8", "U8"]
print("The unique values from list are...:", end = " ")
unique(wells)
Будет ли набор гарантировать одинаковую последовательность?
Нет, set
S неупорядочены. Чтобы OP отсортировал вывод, как в вопросе, set
должен быть отсортирован.
Вы можете использовать
', '.join(set(values))
. Не нужно numpy