Короткий (и полезный) [закрытые] отрывки Python

Может быть закрыт. Оказывается, моя компания блокирует любые вызовы http2, которые выполняются на наших серверах test / prod. Вот почему веб-сокеты работали на моей локальной машине.

46
задан 7 revs 23 May 2017 в 10:29
поделиться

13 ответов

Инициализация 2D списка

В то время как это может быть сделано безопасно для инициализации списка:

lst = [0] * 3

Тот же прием не будет работать на 2D список (список списков):

>>> lst_2d = [[0] * 3] * 3
>>> lst_2d
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> lst_2d[0][0] = 5
>>> lst_2d
[[5, 0, 0], [5, 0, 0], [5, 0, 0]]

Оператор * копирует свои операнды, и дублированные списки, созданные с [], указывают на тот же список. Корректный способ сделать это:

>>> lst_2d = [[0] * 3 for i in xrange(3)]
>>> lst_2d
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> lst_2d[0][0] = 5
>>> lst_2d
[[5, 0, 0], [0, 0, 0], [0, 0, 0]]
21
ответ дан Eli Bendersky 26 November 2019 в 19:59
поделиться

Для Python 2.4 + или ранее:

for x,y in someIterator:
  listDict.setdefault(x,[]).append(y)

В Python 2.5 + существует альтернативное использование defaultdict.

1
ответ дан vartec 26 November 2019 в 19:59
поделиться

Для пониманий списка, которым нужно текущий, затем:

[fun(curr,next) 
 for curr,next 
 in zip(list,list[1:].append(None)) 
 if condition(curr,next)] 

Для циклического списка zip(list,list[1:].append(list[0])).

Для предыдущего, текущего: zip([None].extend(list[:-1]),list) проспект: zip([list[-1]].extend(list[:-1]),list)

5
ответ дан vartec 26 November 2019 в 19:59
поделиться

Мне нравится, когда этот архивирует все в каталоге. Горячая клавиша это для instabackups!

import zipfile

z = zipfile.ZipFile('my-archive.zip', 'w', zipfile.ZIP_DEFLATED)
startdir = "/home/johnf"
for dirpath, dirnames, filenames in os.walk(startdir):
  for filename in filenames:
    z.write(os.path.join(dirpath, filename))
z.close()
5
ответ дан John Feminella 26 November 2019 в 19:59
поделиться

Чтобы узнать, пуста ли строка (т.е. или размер 0 или содержит только пробел), используйте строковую полосу метода в условии, следующим образом:

if not line.strip():    # if line is empty
    continue            # skip it
7
ответ дан Eli Bendersky 26 November 2019 в 19:59
поделиться

Предположим, что у Вас есть список объектов, и Вы хотите словарь с этими объектами как ключи. Используйте fromkeys:

>>> items = ['a', 'b', 'c', 'd']
>>> idict = dict().fromkeys(items, 0)
>>> idict
{'a': 0, 'c': 0, 'b': 0, 'd': 0}
>>>

Вторым аргументом fromkeys является значение, которое предоставят всем недавно созданным ключам.

8
ответ дан Eli Bendersky 26 November 2019 в 19:59
поделиться

Огромное ускорение для вложенного списка и словарей с:

deepcopy = lambda x: cPickle.loads(cPickle.dumps(x))
10
ответ дан vartec 26 November 2019 в 19:59
поделиться

Сглаживать список списков, такой как

[['a', 'b'], ['c'], ['d', 'e', 'f']]

в

['a', 'b', 'c', 'd', 'e', 'f']

использовать

[inner
    for outer in the_list
        for inner in outer]
11
ответ дан George V. Reilly 26 November 2019 в 19:59
поделиться

zip(*iterable) транспонирует повторяемое.

>>> a=[[1,2,3],[4,5,6]]
>>> zip(*a)
    [(1, 4), (2, 5), (3, 6)]

Это также полезно с dicts.

>>> d={"a":1,"b":2,"c":3}
>>> zip(*d.iteritems())
[('a', 'c', 'b'), (1, 3, 2)]
16
ответ дан AKX 26 November 2019 в 19:59
поделиться

Hardlink идентичные файлы в текущем каталоге (на Unix, это означает, что у них есть доля физическое устройство хранения данных, имея в виду намного меньше пространства):

import os
import hashlib

dupes = {}

for path, dirs, files in os.walk(os.getcwd()):
    for file in files:
        filename = os.path.join(path, file)
        hash = hashlib.sha1(open(filename).read()).hexdigest()
        if hash in dupes:
            print 'linking "%s" -> "%s"' % (dupes[hash], filename)
            os.rename(filename, filename + '.bak')
            try:
                os.link(dupes[hash], filename)
                os.unlink(filename + '.bak')
            except:
                os.rename(filename + '.bak', filename)
            finally:
        else:
            dupes[hash] = filename
4
ответ дан rmmh 26 November 2019 в 19:59
поделиться

Единственный 'прием' я знаю, что действительно ошеломил меня, когда я изучил это, перечисляют. Это позволяет Вам иметь доступ к индексам элементов в для цикла.

>>> l = ['a','b','c','d','e','f']
>>> for (index,value) in enumerate(l):
...     print index, value
... 
0 a
1 b
2 c
3 d
4 e
5 f
21
ответ дан theycallmemorty 26 November 2019 в 19:59
поделиться

Мне нравится использовать any и генератор:

if any(pred(x.item) for x in sequence):
    ...

вместо кода, записанного как это:

found = False
for x in sequence:
    if pred(x.n):
        found = True
if found:
    ...

Я сначала узнал об этой технике из статьи Peter Norvig.

34
ответ дан Jacob Gabrielson 26 November 2019 в 19:59
поделиться

Пользовательский список, который при умножении на другой список возвращает декартово произведение ... хорошо то, что декартово произведение является индексируемым, в отличие от itertools.product (но множимые должны быть последовательности, а не итераторы).

import operator

class mylist(list):
    def __getitem__(self, args):
        if type(args) is tuple:
            return [list.__getitem__(self, i) for i in args]
        else:
            return list.__getitem__(self, args)
    def __mul__(self, args):
        seqattrs = ("__getitem__", "__iter__", "__len__")
        if all(hasattr(args, i) for i in seqattrs):
            return cartesian_product(self, args)
        else:
            return list.__mul__(self, args)
    def __imul__(self, args):
        return __mul__(self, args)
    def __rmul__(self, args):
        return __mul__(args, self)
    def __pow__(self, n):
        return cartesian_product(*((self,)*n))
    def __rpow__(self, n):
        return cartesian_product(*((self,)*n))

class cartesian_product:
    def __init__(self, *args):
        self.elements = args
    def __len__(self):
        return reduce(operator.mul, map(len, self.elements))
    def __getitem__(self, n):
        return [e[i] for e, i  in zip(self.elements,self.get_indices(n))]
    def get_indices(self, n):
        sizes = map(len, self.elements)
        tmp = [0]*len(sizes)
        i = -1
        for w in reversed(sizes):
            tmp[i] = n % w
            n /= w
            i -= 1
        return tmp
    def __add__(self, arg):
        return mylist(map(None, self)+mylist(map(None, arg)))
    def __imul__(self, args):
        return mylist(self)*mylist(args)
    def __rmul__(self, args):
        return mylist(args)*mylist(self)
    def __mul__(self, args):
        if isinstance(args, cartesian_product):
            return cartesian_product(*(self.elements+args.elements))
        else:
            return cartesian_product(*(self.elements+(args,)))
    def __iter__(self):
        for i in xrange(len(self)):
            yield self[i]
    def __str__(self):
        return "[" + ",".join(str(i) for i in self) +"]"
    def __repr__(self):
        return "*".join(map(repr, self.elements))
1
ответ дан 26 November 2019 в 19:59
поделиться
Другие вопросы по тегам:

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