2012-02-14 12 views
42

Jakie są ekwiwalenty R dla tych list Python listowe:Zip lub wyliczyć w R?

[(i,j) for i,j in zip(index, Values)] 
[(i,j) for i,j in enumerate(Values)] 
[(i,j) for i,j in enumerate(range(10,20))] %MWE, indexing or enumerating to 
              %keep up with the index, there may 
              %be some parameter to look this up 

Przykład z wyjściem

>>> [(i,j) for i,j in enumerate(range(10,20))] 
[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)] 

Mam rozwiązać ten problem wcześniej z jakąś sztuczkę w R, ale nie pamiętam już, pierwszy Pomysł był itertools -pkg, ale mam nadzieję znaleźć bardziej idiomatyczny sposób robienia rzeczy.

+2

jeśli można dać mały pracował przykładem dla tych z nas, którzy nie są zaznajomieni z Pythona może zwiększyć populację potencjalnych Główni odpowiadający. Zgaduję, że ostatnia to 'expand.grid (i = 10: 20, j = 10: 20)' –

+0

@BenBolker: dodano wyjście - teraz jasne? To może być trudniejsze, ale logika jest ważna ... – hhh

+1

Zgadzam się z @DWin. Nieuzasadnione jest oczekiwanie odwzorowania typu "jeden do jednego" między strukturami danych w R i Pythonie. Jeśli chcesz uzyskać dobre odpowiedzi, powinieneś określić, w jaki sposób chcesz wyglądać w Rythonie w Rythonie. – joran

Odpowiedz

25

były pewne dyskusje wokół listowego dla R, np here lub there. Pakiet hash oferuje nawet strukturę słownikową. Jednak, jak powiedzieli inni, trudno jest mapować jedno wyposażenie językowe na inne (nawet jeśli tak naprawdę oferuje to oferta) bez jasnego zrozumienia tego, do czego ma być przyzwyczajony. Na przykład, mogę naśladować Python zip() w R następująco:

Python

In [1]: x = [1,2,3] 
In [2]: y = [4,5,6] 
In [3]: zip(x, y) 
Out[3]: [(1, 4), (2, 5), (3, 6)] 

R

> x <- 1:3 
> y <- 4:6 
> list(x, y)      # gives a simple list 
> as.list(paste(x, y))   # three tuples, as a list of characters 
> mapply(list, x, y, SIMPLIFY=F) # gives a list of 3 tuples 
> rbind(x, y)     # gives a 2x3 matrix 

Jak widać, to naprawdę zależy od tego, co chcesz zrób z wynikiem później.

+0

Myślę, że pytanie jest tym, czego używasz kiedy używałbyś zip w pytonie. typowe użycie polega na robieniu listy z wieloma argumentami, więc obsługuje to bezpośrednio. – seanv507

5

Jeśli tak jest przedstawienie druku Python od matrycy, następnie ten kod:

j <- 10:20 
matrix(c(seq_along(j), j), ncol=2) 
#------------ 
     [,1] [,2] 
[1,] 1 10 
[2,] 2 11 
[3,] 3 12 
[4,] 4 13 
[5,] 5 14 
[6,] 6 15 
[7,] 7 16 
[8,] 8 17 
[9,] 9 18 
[10,] 10 19 
[11,] 11 20 

Jesteś pozostawiając tych z nas, którzy nie są użytkownikami Python w ciemności odnośnie struktury żądanego wyjścia. Używa się terminu "lista", ale wynik sugeruje uporządkowany zbiór krotek.

udzielić wskazówek @ Chi możemy także zaproponować użyciu bardzo R-centric „dataframe” struktura

x <- 1:3 
y <- 4:6 
dfrm <- data.frame(x=x, y=y) 

... który ma elastyczność listy pod względem typów kolumn i funkcje dostępu o macierz pod względem indeksowania wierszy i kolumn. Lub można użyć żądania hhh i utworzyć domyślnie indeksowane wartości wektora j, 10:20, używając wektora rownames, który domyślnie zaczyna się od "1", ale który można zmienić, aby stał się wektorowym znakiem rozpoczynającym się od "0"

dfrm <- data.frame(j=10:20) 
dfrm[3, ] 
#[1] 12 

rownames(dfrm) <- 0:10 
dfrm["0",] 
# [1] 10 

Niestety nieostrożnych znajdzie że dfrm [0,], nie jest zadowolony wezwanie, wracając wektor długości 0.

+0

+1 dla eleganckiego rozwiązania. (Nie, to nie są macierze Pythona, ale jak już się domyśliliście [lista krotek] (http://docs.python.org/library/functions.html#zip)). – chl

22

odpowiedzi na pytona enumerate:

W R, lista jest sortowana (patrz this answer). Tak więc, wszystko, czego potrzebujesz, to indeksowanie dowolnych klawiszy (używając names()[i]) lub wartości (używając [[i]]).

Korzystanie seq_along (alternatywnie można zrobić for(i in 1:length(mylist)){...}):

> mylist <- list('a'=10,'b'=20,'c'=30) 
> for (i in seq_along(mylist)){ 
+ print(paste(i,names(mylist)[i],mylist[[i]])) 
+ } 
[1] "1 a 10" 
[1] "2 b 20" 
[1] "3 c 30" 

odpowiedzi na pytona zip:

Zobacz jeden z powyższych odpowiedzi naśladować listę krotek. Moje preferencje to do ramki danych, jak pokazano w odpowiedzi BondedDust za:

> x <- 1:3 
> y <- 4:6 
> data.frame(x=x, y=y) 
    x y 
1 1 4 
2 2 5 
3 3 6