Наступил другой день, когда я работал над собственной проблемой. Мне нравится подход Луки Ране, но я думал, что использование класса Counter в библиотеке коллекций показалось скромным. Вот мой код:
def unique_permutations(elements):
"Returns a list of lists; each sublist is a unique permutations of elements."
ctr = collections.Counter(elements)
# Base case with one element: just return the element
if len(ctr.keys())==1 and ctr[ctr.keys()[0]] == 1:
return [[ctr.keys()[0]]]
perms = []
# For each counter key, find the unique permutations of the set with
# one member of that key removed, and append the key to the front of
# each of those permutations.
for k in ctr.keys():
ctr_k = ctr.copy()
ctr_k[k] -= 1
if ctr_k[k]==0:
ctr_k.pop(k)
perms_k = [[k] + p for p in unique_permutations(ctr_k)]
perms.extend(perms_k)
return perms
Этот код возвращает каждую перестановку в виде списка. Если вы будете кормить его строкой, она даст вам список перестановок, где каждый из них представляет собой список символов. Если вы хотите, чтобы результат был как список строк (например, если вы ужасный человек, и вы хотите злоупотреблять моим кодом, чтобы помочь вам обмануть Scrabble), просто выполните следующие действия:
[''.join(perm) for perm in unique_permutations('abunchofletters')]
strip
не означает «удалить эту подстроку». x.strip(y)
рассматривает y
как набор символов и разбивает любые символы в этом наборе с концов x
.
Вместо этого вы можете использовать endswith
и нарезку:
url = 'abcdc.com'
if url.endswith('.com'):
url = url[:-4]
Или с использованием регулярных выражений:
import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)
Это идеальное использование для регулярных выражений:
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'
Зависит от того, что вы знаете о своем URL-адресе и точно, что вы пытаетесь сделать. Если вы знаете, что он всегда будет заканчиваться на «.com» (или «.net» или «.org»), то
url=url[:-4]
является самым быстрым решением. Если это более общие URL-адреса, вам, вероятно, лучше смотреть в библиотеку urlparse, которая поставляется с python.
Если вы, с другой стороны, просто хотите удалить все после финального '.' в строке, то
url.rsplit('.',1)[0]
будет работать. Или, если вы хотите, просто хотите, чтобы все было до первого ». затем попробуйте
url.split('.',1)[0]
В одной строке:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Если вы хотите удалить только расширение
url = 'abcdc.com'
print('.'.join(url.split('.')[:-1]))
, оно работает с любым расширением, с потенциальными другими точками, существующими в имени файла. Он просто разбивает строку на список по точкам и соединяет ее без последнего элемента.
Вероятно, не самый быстрый, но для меня он более читабельен, чем другие методы.
def strip_end(text, suffix):
if not text.endswith(suffix):
return text
return text[:len(text)-len(suffix)]
return text[:-len(suffix)]
– Jabba
2 August 2013 в 07:07
Для URL-адресов (как кажется, это часть темы по данному примеру), можно сделать что-то вроде этого:
import os
url = 'http://www.stackoverflow.com'
name,ext = os.path.splitext(url)
print (name, ext)
#Or:
ext = '.'+url.split('.')[-1]
name = url[:-len(ext)]
print (name, ext)
Оба выводят: ('http://www.stackoverflow', '.com')
Это также можно комбинировать с str.endswith(suffix)
, если вам нужно просто разделить «.com» или что-то конкретное.
В моем случае мне нужно было создать исключение, поэтому я сделал:
class UnableToStripEnd(Exception):
"""A Exception type to indicate that the suffix cannot be removed from the text."""
@staticmethod
def get_exception(text, suffix):
return UnableToStripEnd("Could not find suffix ({0}) on text: {1}."
.format(suffix, text))
def strip_end(text, suffix):
"""Removes the end of a string. Otherwise fails."""
if not text.endswith(suffix):
raise UnableToStripEnd.get_exception(text, suffix)
return text[:len(text)-len(suffix)]
Или вы можете использовать split:
a = 'abccomputer.com'
res = a.split('.com',1)[0]
Так как кажется, что никто еще не указал это:
url = "www.example.com"
new_url = url[:url.rfind(".")]
Это должно быть более эффективным, чем методы, использующие split()
, поскольку новый объект списка не создается, и это решение работает для строки с несколькими точками.
Если вы уверены, что строка появляется только в конце, то самым простым способом было бы использовать «replace»:
url = 'abcdc.com'
print url.replace('.com','')
www.computerhope.com
. сделайте чек с endswith()
, и все должно быть хорошо.
– ghostdog74
7 March 2010 в 01:26
"www.computerhope.com".endswith(".com")
правда, он все равно сломается!
– user
23 March 2015 в 21:31
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
Я хочу повторить этот ответ как наиболее выразительный способ сделать это. Конечно, следующее будет меньше времени процессора
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
Однако, если процессор - это горлышко бутылки, зачем писать в Python?
Когда CPU - это шейка бутылки? в драйверах, возможно.
Преимущества использования регулярного выражения - это повторное использование кода. Что делать, если вам нужно удалить «.me», который имеет только три символа?
Тот же код выполнит трюк.
>>> rm_sub('abcdc.me','.me')
'abcdc'
Если вы знаете, что это расширение, то
url = 'abcdc.com'
...
url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split
Это одинаково хорошо работает с abcdc.com
или www.abcdc.com
или abcdc.[anything]
и более расширяемо.
url.rsplit ('. com', 1)
blockquote>не совсем прав.
На самом деле вам нужно написать
url.rsplit('.com', 1)[0]
, и это выглядит довольно сжатым IMHO.
Однако, мое личное предпочтение - это этот вариант, потому что он использует только один параметр:
url.rpartition('.com')[0]
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
– Burhan Khalid 7 May 2013 в 05:56remove='.com'
...url = url[:-len(remove)]
– Jasen 26 March 2015 в 03:50