Хотя я нашел решение, из-за отсутствия опыта работы с полярами мне кажется, что оно многословно.
Пример задания:
Код: Выделить всё
input = "[[1,1,2,2,3,3,4],[9,9,8,8,7,7,6]]"
result = find_odd_counts(input)
print(result)
"[4,6]"
Код: Выделить всё
import polars as pl
from time import perf_counter
data: str
with open("samples.json", "r") as file:
data = file.read()
t_start = perf_counter()
result = (
pl.LazyFrame({"data": data})
.select(pl.col("data").str.json_decode().explode())
.with_columns(
id = pl.int_range(0, pl.col("data").count())
)
.explode("data")
.group_by("id")
.agg(pl.col("data").value_counts(parallel=True))
.explode("data")
.unnest("data")
.group_by("id")
.agg(pl.col("data").filter(pl.col("count").mod(2) == 1))
.explode("data")
.collect()
.get_column("data")
.to_list()
)
t_stop = perf_counter()
print(result)
print(f"Compute {round((t_stop-t_start) * 1000, 2)}ms")
Разбор строки json:
Обратите внимание: из-за https://github.com/pola-rs/polars/issues/8470 я не могу использовать Polars.read_json
Код: Выделить всё
parsed_json = pl.DataFrame({"data": data}).select(pl.col("data").str.json_extract()).explode())
print(parsed_json)
shape: (500, 1)
┌────────────────┐
│ data │
│ --- │
│ list[u8] │
╞════════════════╡
│ [7, 5, … 7] │
│ [85, 73, … 90] │
│ [81, 86, … 89] │
│ [76, 26, … 96] │
│ … │
│ [11, 37, … 85] │
│ [13, 51, … 94] │
│ [18, 18, 18] │
│ [54, 60, … 98] │
└────────────────┘
Код: Выделить всё
ids = parsed_json.with_columns(
id= pl.int_range(0, pl.col("data").count())
)
print(ids)
shape: (500, 2)
┌────────────────┬─────┐
│ data ┆ id │
│ --- ┆ --- │
│ list[u8] ┆ i64 │
╞════════════════╪═════╡
│ [7, 5, … 7] ┆ 0 │
│ [85, 73, … 90] ┆ 1 │
│ [81, 86, … 89] ┆ 2 │
│ [76, 26, … 96] ┆ 3 │
│ … ┆ … │
│ [11, 37, … 85] ┆ 496 │
│ [13, 51, … 94] ┆ 497 │
│ [18, 18, 18] ┆ 498 │
│ [54, 60, … 98] ┆ 499 │
└────────────────┴─────┘
Код: Выделить всё
counts = ids.explode("data").group_by("id").agg(pl.col("data").value_counts(parallel=True)).explode("data").unnest("data")
print(counts)
shape: (18_157, 3)
┌─────┬──────┬────────┐
│ id ┆ data ┆ counts │
│ --- ┆ --- ┆ --- │
│ i64 ┆ u8 ┆ u32 │
╞═════╪══════╪════════╡
│ 0 ┆ 48 ┆ 2 │
│ 0 ┆ 42 ┆ 4 │
│ 0 ┆ 84 ┆ 2 │
│ 0 ┆ 67 ┆ 2 │
│ … ┆ … ┆ … │
│ 499 ┆ 24 ┆ 2 │
│ 499 ┆ 56 ┆ 2 │
│ 499 ┆ 60 ┆ 2 │
│ 499 ┆ 54 ┆ 3 │
└─────┴──────┴────────┘
Код: Выделить всё
find_odds = counts.group_by("id").agg(pl.col("data").filter(pl.col("counts").mod(2) == 1))
print(find_odds)
shape: (500, 2)
┌─────┬──────────┐
│ id ┆ data │
│ --- ┆ --- │
│ i64 ┆ list[u8] │
╞═════╪══════════╡
│ 0 ┆ [5] │
│ 1 ┆ [85] │
│ 2 ┆ [51] │
│ 3 ┆ [43] │
│ … ┆ … │
│ 496 ┆ [5] │
│ 497 ┆ [57] │
│ 498 ┆ [18] │
│ 499 ┆ [54] │
└─────┴──────────┘
Код: Выделить всё
result = find_odds.explode("data").get_column("data").to_list()
print(result)
[5, 85, 51, ..., 18, 54]
- Полный пример файла
- Ответы
Подробнее здесь: https://stackoverflow.com/questions/772 ... -dataframe
Мобильная версия