Вот пример из модуля itertools docs:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
Для Python 2 вам нужно itertools.izip
вместо zip
:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
Как это работает:
Сначала создаются два параллельных итератора a
и b
(вызов tee()
), оба указывающие на первый элемент исходного итерабельного. Второй итератор b
перемещается на 1 шаг вперед (вызов next(b, None)
). На этом этапе a
указывает на s0 и b
указывает на s1. И a
, и b
могут перемещаться по исходному итератору независимо друг от друга - функция izip принимает два итератора и создает пары возвращаемых элементов, продвигая оба итератора в одинаковом темпе.
Одно предупреждение: [tee()
создает два итератора, которые могут продвигаться независимо друг от друга, но это связано с затратами. Если один из итераторов продвигается дальше другого, тогда tee()
необходимо сохранить потребляемые элементы в памяти до тех пор, пока второй итератор не сравнит их (он не сможет «перемотать» исходный итератор). Здесь это не имеет значения, потому что один итератор только на шаг впереди другого, но в целом легко использовать много памяти.
И поскольку tee()
может принимать n
параметр, это также можно использовать для более чем двух параллельных итераторов:
def threes(iterator):
"s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
a, b, c = itertools.tee(iterator, 3)
next(b, None)
next(c, None)
next(c, None)
return zip(a, b, c)
Принятый ответ детализирует только эстетику по умолчанию, вот то, как получить всех их:
library(tidyverse)
env <- asNamespace("ggplot2")
all_Geoms <- ls(envir = env, pattern = "^Geom.+")
all_Geoms <- mget(all_Geoms, env)
all_aes <- map(all_Geoms, ~.$aesthetics())
# change Geom* to geom_*
names(all_aes) <-
names(all_aes) %>%
substr(5,nchar(.)) %>%
tolower() %>%
paste0("geom_",.)
# remove if geom_* doesn't exist
all_aes[!names(all_aes) %in% ls(envir = env)] <- NULL
head(all_aes, 3)
#> $geom_abline
#> [1] "slope" "intercept" "colour" "size" "linetype" "alpha"
#> [7] "group"
#>
#> $geom_area
#> [1] "x" "y" "colour" "fill" "size" "linetype"
#> [7] "alpha" "group"
#>
#> $geom_bar
#> [1] "x" "y" "colour" "fill" "size" "linetype"
#> [7] "alpha" "group"
all_aes_long <- all_aes %>%
enframe("fun","aes") %>%
unchop(aes)
all_aes_long
#> # A tibble: 325 x 2
#> fun aes
#> <chr> <chr>
#> 1 geom_abline slope
#> 2 geom_abline intercept
#> 3 geom_abline colour
#> 4 geom_abline size
#> 5 geom_abline linetype
#> 6 geom_abline alpha
#> 7 geom_abline group
#> 8 geom_area x
#> 9 geom_area y
#> 10 geom_area colour
#> # ... with 315 more rows
, которую я предлагаю использовать View()
для визуализации этого.
all_aes_wide <-
all_aes_long%>%
mutate(val = 1) %>%
spread(aes,val,fill = 0)
all_aes_wide
#> # A tibble: 38 x 38
#> fun alpha angle colour family fill fontface geometry group height
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 geom~ 1 0 1 0 0 0 0 1 0
#> 2 geom~ 1 0 1 0 1 0 0 1 0
#> 3 geom~ 1 0 1 0 1 0 0 1 0
#> 4 geom~ 0 0 0 0 0 0 0 1 0
#> 5 geom~ 1 0 1 0 1 0 0 1 0
#> 6 geom~ 1 0 1 0 1 0 0 1 0
#> 7 geom~ 1 0 1 0 0 0 0 1 0
#> 8 geom~ 1 0 1 0 1 0 0 1 0
#> 9 geom~ 1 0 1 0 0 0 0 1 0
#> 10 geom~ 1 0 1 0 1 0 0 1 0
#> # ... with 28 more rows, and 28 more variables: hjust <dbl>,
#> # intercept <dbl>, label <dbl>, lineheight <dbl>, linetype <dbl>,
#> # lower <dbl>, map_id <dbl>, middle <dbl>, radius <dbl>, shape <dbl>,
#> # size <dbl>, slope <dbl>, stroke <dbl>, subgroup <dbl>, upper <dbl>,
#> # vjust <dbl>, weight <dbl>, width <dbl>, x <dbl>, xend <dbl>,
#> # xintercept <dbl>, xmax <dbl>, xmin <dbl>, y <dbl>, yend <dbl>,
#> # yintercept <dbl>, ymax <dbl>, ymin <dbl>
table(all_aes_long$aes)
#>
#> alpha angle colour family fill fontface
#> 37 3 36 2 20 2
#> geometry group height hjust intercept label
#> 1 38 2 2 1 2
#> lineheight linetype lower map_id middle radius
#> 2 33 1 1 1 1
#> shape size slope stroke subgroup upper
#> 4 35 1 4 2 1
#> vjust weight width x xend xintercept
#> 2 6 2 30 2 1
#> xmax xmin y yend yintercept ymax
#> 2 2 27 2 1 8
#> ymin
#> 8