Подсчет частот объекта в Python

Я сделал это, и это прекрасно работает.

1. composer.json:

От:

"require": {
        "php": ">=7.0.0",
        "fideloper/proxy": "~3.3",
        "laravel/framework": "5.5.*",
        "laravel/tinker": "~1.0"
    },

До:

"require": {
        "php": ">=7.1.3",
        "fideloper/proxy": "~4.0",
        "laravel/framework": "5.6.*",
        "laravel/tinker": "~1.0"
    },

2. Замените файл app \ Http \ Middleware \ TrustedProxies.php содержимым ниже:

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies;

    /**
     * The headers that should be used to detect proxies.
     *
     * @var string
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

3. обновление композитора

53
задан glhr 20 April 2019 в 00:27
поделиться

6 ответов

defaultdict на помощь!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1

Это выполняется за O (n).

93
ответ дан 7 November 2019 в 08:14
поделиться

Стандартный подход:

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"
words = words.split()
result = defaultdict(int)
for word in words:
    result[word] += 1

print result

Группировка по одному:

from itertools import groupby

words = "apple banana apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result
11
ответ дан 7 November 2019 в 08:14
поделиться

Класс Counter в модуле collections специально создан для решения этого типа проблем:

from collections import Counter
words = "apple banana apple strawberry banana lemon"
Counter(words.split())
# Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})
129
ответ дан 7 November 2019 в 08:14
поделиться

Если вы не хотите использовать стандартный метод словаря (цикл по списку, увеличивая соответствующий ключ словаря), вы можете попробовать следующее:

>>> from itertools import groupby
>>> myList = words.split() # ['apple', 'banana', 'apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]

Он выполняется за O (n log n) время.

7
ответ дан 7 November 2019 в 08:14
поделиться

Без defaultdict:

words = "apple banana apple strawberry banana lemon"
my_count = {}
for word in words.split():
    try: my_count[word] += 1
    except KeyError: my_count[word] = 1
3
ответ дан 7 November 2019 в 08:14
поделиться
freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

Я думаю, что результат такой же, как у решения Триптиха, но без импорта коллекций. Также немного похоже на решение Селинапа, но более читабельно. Практически идентично решению Томаса Вейгеля, но без использования исключений.

Однако это может быть медленнее, чем использование defaultdict () из библиотеки коллекций. Поскольку значение извлекается, увеличивается и затем снова присваивается. Вместо того, чтобы просто увеличивать. Однако использование + = может сделать то же самое внутри.

9
ответ дан 7 November 2019 в 08:14
поделиться
Другие вопросы по тегам:

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