Как отфильтровать данные?

S
На сайте с 30.09.2016
Offline
459
#41

Если начинать от стартпоста, то там массив объектов. Проблема решения задачи высосана из пальца.

Решение на javascript:

a.map(function(item){if(item.media_category!='promo')b.push(item)});

Решение на PHP:

foreach($arr as $k=>$a) if($a->media_category == 'promo') unset($arr[$k]);

Но правильнее сразу делать выборку из БД. И БД выбирать такую, которая может хранить структурированные данные, а не всякое говно.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
D
На сайте с 18.12.2015
Offline
142
#42
timo-71:
Иметь такой JSON, идея сама по себе сомнительная. Если это файл, то да, ваше решение наверное единственное здесь, которое как то решит задачу.

А в чем тогда сложность задачи? Если у нас 20 строк, мы их распаковали в массив, отфильтровали и... на этом все. Тот же array_filter или filter/reduce в JS. В чем интерес? Где потоковое чтение? В метках темы sly32 написал data science, только им тут и не пахнет. Пока что это junior tasks.

Ну и кстати, идея не сомнительная. Обычно такие файлы остаются от логов Nginx, которые нужно на лету парсить и строить аналитику по ним. Или например прислали выгрузку для синхронизации товарных остатков, там не редкость те же XML файлы на пару гигов. Или сайтмеп например распарсить у сайта. Примеров уйма.

Разработка и поддержка высоконагруженных проектов.
T7
На сайте с 19.09.2018
Offline
36
#43
danforth:
А в чем тогда сложность задачи

Несложная, да. Может относиться к задаче стоило с учетом первой фразы темы:

Sly32:
Если кому надоело ставить плагины
danforth:
там не редкость те же XML файлы на пару гигов. Или сайтмеп например распарсить у сайта.

Для XML даже для PHP есть средства которые не грузят весь файл в память. Логи - csv построчно легко читаются .

А в целом, да, согласен, что если есть инструменты для потокового чтения JSON это хорошо. "Сомнительная" это я к тому, что я бы в таких JSON файлах данные бы не хранил

D
На сайте с 18.12.2015
Offline
142
#44
timo-71:
Может относиться к задаче стоило с учетом первой фразы темы:

Ну оно как бы да, но с другой стороны зачем тогда в метках data science - не понятно)

timo-71:
Для XML даже для PHP есть средства которые не грузят весь файл в память. Логи - csv построчно легко читаются .
А в целом, да, согласен, что если есть инструменты для потокового чтения JSON это хорошо. "Сомнительная" это я к тому, что я бы в таких JSON файлах данные бы не хранил

Ну обычно никто ничего важного в JSON и не хранит. Как правило, есть условный файл, куда пишется поток каких-то событий, и нужно эти события читать и парсить. Вариант прочитать весь файл в память и распарсить в массив, по понятным причинам, не всегда возможен. Я к тому, что если кому-то задача кажется слишком легкой, можно например применить немного скилла, и прочитать данные немножко по другому :) Ведь данные не всегда нужны все и сразу, как в данном примере. Нам не нужно находить дубли, и т.д.

Подождем Sly32, посомтрим как он решит задачу

S3
На сайте с 29.03.2012
Offline
222
#45

Про data science была только шутка)

На пайтоне это будет одна строка

playbacks = filter(lambda _data: _data['media_category'] not in ['promo'], data)

O
На сайте с 30.09.2019
Offline
18
#46

Ну, использовали lambda-выражение для вызова встроенной функции. В чём прикол? (Если что, я не программист)

Показать, что в питоне больше встроенных функций, чем в php?

D
На сайте с 18.12.2015
Offline
142
#47
Sly32:
playbacks = filter(lambda _data: _data['media_category'] not in ['promo'], data)

И чем является data в данном примере? Кидай весь код)

T7
На сайте с 19.09.2018
Offline
36
#48
onep:
lambda-выражение для вызова встроенной функции

анонимной

Sly32:
playbacks = filter(lambda _data: _data['media_category'] not in ['promo'], data)

Ну так, в порядке буквоедства

playbacks = filter(lambda _data: _data['media_category'] not in ['promo'], [
    {'a':'b'},
{'b':'x'},
{'media_category':'promo'},
])
print(list(playbacks));
playbacks = filter(lambda _data: _data['media_category'] not in ['promo'], [
KeyError: 'media_category'

 _data.get(['media_category')

Поможет

То, что dict мы абсолютно уверены, т.к. выборка из носкуэл

---------- Добавлено 13.06.2020 в 21:34 ----------

И да, чуть длиннее, но смысл тот же

timo-71:
$a=array_filter($a,function($v){return !in_array(_arr($v,'media_category'),['promo','xxx']);});

🍿

O
На сайте с 30.09.2019
Offline
18
#49

Интересно посмотреть пример сортировки массива с алфавитно-цифровыми строками на питоне (в поиске не нашёл, в споры какой язык лучше не ввязываюсь).


['MacBook Air 13.3-inch (2018)','MacBook Air 13.3-inch with Retina Display (2018)','AirPods','Apple Pencil','Apple Watch','MacBook','MacBook Air','MacBook Pro','iPad 9.7 (2018)','iPad 10.2 (2019)','iPad Air','iPad Air (2019)','iPad Air 2','iPad 2','iPad 3','iPad 4','iPad 9.7','iPad Mini','iPad Mini (2019)','iPad Mini 2','iPad Mini 3','iPad Mini 4','iPad Pro 9.7','iPad Pro 10.5','iPad Pro 11-inch','iPad Pro 11-inch (2020)','iPad Pro 12.9','iPad Pro 12.9 (2017)','iPad Pro 12.9 (2018)','iPad Pro 12.9-inch (2020)','iPhone 4','iPhone 4s','iPhone 5','iPhone 5c','iPhone 5s','iPhone 6','iPhone 6 Plus','iPhone 6s','iPhone 6s Plus','iPhone 7','iPhone 7 Plus','iPhone 8','iPhone 8 Plus','iPhone 11','iPhone 11 Pro','iPhone XS 5.8-inch','iPhone XS Max','iPhone 11 Pro Max','iPhone SE','iPhone SE 2','iPhone X','iPhone XR','iPod Touch (2019)','iPod Touch 5','iPod Touch 6']

На php написал бы так:


uksort($data, my_uksort($data));
function my_uksort($data) {
return function($a, $b) use($data) {
return strnatcmp($data[$a], $data[$b]);
};
}
T7
На сайте с 19.09.2018
Offline
36
#50
onep:
посмотреть пример сортировки массива с алфавитно-цифровыми

Огромный плюс питона, что есть все на все случаи жизни (pip install natsort)

import natsort

u = natsort.natsorted(u)

['AirPods',
 'Apple Pencil',

'Apple Watch',
'MacBook',
'MacBook Air',
'MacBook Air 13.3-inch (2018)',
'MacBook Air 13.3-inch with Retina Display (2018)',
'MacBook Pro',
'iPad 2',
'iPad 3',
'iPad 4',
'iPad 9.7',
'iPad 9.7 (2018)',
'iPad 10.2 (2019)',
'iPad Air',
'iPad Air 2',
'iPad Air (2019)',
'iPad Mini',
'iPad Mini 2',
'iPad Mini 3',
'iPad Mini 4',
'iPad Mini (2019)',
'iPad Pro 9.7',
'iPad Pro 10.5',
'iPad Pro 11-inch',
'iPad Pro 11-inch (2020)',
'iPad Pro 12.9',
'iPad Pro 12.9 (2017)',
'iPad Pro 12.9 (2018)',
'iPad Pro 12.9-inch (2020)',
'iPhone 4',
'iPhone 4s',
'iPhone 5',
'iPhone 5c',
'iPhone 5s',
'iPhone 6',
'iPhone 6 Plus',
'iPhone 6s',
'iPhone 6s Plus',
'iPhone 7',
'iPhone 7 Plus',
'iPhone 8',
'iPhone 8 Plus',
'iPhone 11',
'iPhone 11 Pro',
'iPhone 11 Pro Max',
'iPhone SE',
'iPhone SE 2',
'iPhone X',
'iPhone XR',
'iPhone XS 5.8-inch',
'iPhone XS Max',
'iPod Touch 5',
'iPod Touch 6',
'iPod Touch (2019)']

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий