Я сделал это, и это прекрасно работает.
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. обновление композитора
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).
Стандартный подход:
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
Класс 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})
Если вы не хотите использовать стандартный метод словаря (цикл по списку, увеличивая соответствующий ключ словаря), вы можете попробовать следующее:
>>> 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) время.
Без 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
freqs = {}
for word in words:
freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize
Я думаю, что результат такой же, как у решения Триптиха, но без импорта коллекций. Также немного похоже на решение Селинапа, но более читабельно. Практически идентично решению Томаса Вейгеля, но без использования исключений.
Однако это может быть медленнее, чем использование defaultdict () из библиотеки коллекций. Поскольку значение извлекается, увеличивается и затем снова присваивается. Вместо того, чтобы просто увеличивать. Однако использование + = может сделать то же самое внутри.