То, что будет самым быстрым, зависит от того, какой процент Вашего списка является дубликатами. Если это будут почти все дубликаты с немногими уникальными объектами, то создавание нового списка, вероятно, будет быстрее. Если это будут главным образом уникальные объекты, то удалять их из исходного списка (или копия) будет быстрее.
Вот один для изменения списка на месте:
def unique(items):
seen = set()
for i in xrange(len(items)-1, -1, -1):
it = items[i]
if it in seen:
del items[i]
else:
seen.add(it)
Итерация назад по индексам гарантирует, что удаление объектов не влияет на повторение.
instead of trying to get a page then figuring out the charset the browser would use, why not just use a browser to fetch the page and check what charset it uses..
from win32com.client import DispatchWithEvents
import threading
stopEvent=threading.Event()
class EventHandler(object):
def OnDownloadBegin(self):
pass
def waitUntilReady(ie):
"""
copypasted from
http://mail.python.org/pipermail/python-win32/2004-June/002040.html
"""
if ie.ReadyState!=4:
while 1:
print "waiting"
pythoncom.PumpWaitingMessages()
stopEvent.wait(.2)
if stopEvent.isSet() or ie.ReadyState==4:
stopEvent.clear()
break;
ie = DispatchWithEvents("InternetExplorer.Application", EventHandler)
ie.Visible = 0
ie.Navigate('http://kskky.info')
waitUntilReady(ie)
d = ie.Document
print d.CharSet
Используйте универсальный детектор кодирования :
>>> import chardet
>>> chardet.detect(urlread("http://google.cn/"))
{'encoding': 'GB2312', 'confidence': 0.99}
Другой вариант - просто использовать wget:
import os
h = os.popen('wget -q -O foo1.txt http://foo.html')
h.close()
s = open('foo1.txt').read()
Когда вы загружаете файл с urllib или urllib2, вы можете узнать, был ли передан заголовок кодировки:
fp = urllib2.urlopen(request)
charset = fp.headers.getparam('charset')
Вы можете использовать BeautifulSoup, чтобы найти метаэлемент в HTML:
soup = BeatifulSoup.BeautifulSoup(data)
meta = soup.findAll('meta', {'http-equiv':lambda v:v.lower()=='content-type'})
Если ни один из них не доступен, браузеры обычно возвращаются к пользовательской конфигурации в сочетании с автоопределением. Как предлагает rajax, вы можете использовать модуль chardet. Если у вас есть доступная пользовательская конфигурация, в которой указано, что страница должна быть китайской (скажем), вы можете сделать это лучше.
Похоже, вам нужен гибрид представленных ответов:
, используя красивый суп или другой метод Честно говоря, я не верю, что вы найдете что-то лучше этого.
На самом деле, если вы прочитаете FAQ, на который вы ссылались в комментариях к другому ответу, это то, что защищает автор библиотеки детекторов.
Если вы верите в FAQ,