R'deki bir python diktesinin eşdeğeri


83

R'de bir python diktesinin eşdeğerini yapmak istiyorum. Temel olarak, python'da:

visited = {}

if atom_count not in visited:
  Do stuff
  visited[atom_count] = 1

Buradaki fikir, eğer o atom_count'u görürsem, [atom_count] = 1'i ziyaret etmişimdir. Dolayısıyla, o atom_count'u tekrar görürsem, "Bir şeyler yapmam". Atom_Count bir tamsayıdır.

Teşekkürler!


5
hashNeredeyse Python benzeri erişim işlevlerine sahip R paketini görün .
Hans W.

@ O (n) 'ye mal olacak kovalamaca. Dict elemanı erişimi sabittir.
anilbey

Yanıtlar:


74

R'deki bir python diktesine en yakın şey basitçe bir listedir. Çoğu R veri türü gibi, listeler, listelerin bir dizi ad-değer çifti gibi davranmasına olanak tanıyan bir ad özniteliğine sahip olabilir:

> l <- list(a = 1,b = "foo",c = 1:5)
> l
$a
[1] 1

$b
[1] "foo"

$c
[1] 1 2 3 4 5

> l[['c']]
[1] 1 2 3 4 5
> l[['b']]
[1] "foo"

Şimdi olağan feragatname için: tam olarak aynı değiller ; farklılıklar olacak. Bu yüzden listeleri tam anlamıyla python'da bir dikteyi kullanabileceğiniz şekilde kullanmaya çalışmak için hayal kırıklığı yaratacaksınız.


Böyle bir listeyi programlı olarak nasıl yineleyebilirsiniz? saflık l$names(l)[1]belli ki başarısız olur. Ben de l[which()]işe
gidemedim

@MikePalmice Etraftaki forhemen hemen her dilde bir tür seçenek olan bir döngü dışında , var lapply. Farklı sözdizimi gibi olan ilgili şeyler de vardır Map, ve bir bütün paket purrr fonksiyonel programlama şeyler bir sürü için.
joran

@MikePalmice, bence l[[names(l)[1]]çalışmalı. Her neyse, şu şekilde yineleyebilirsiniz: l[[1]]isimleri kullanmadan. Tek parantezlerin []bir liste döndüreceğine, çift parantezlerin [[]]ise listedeki nesneyi döndüreceğine dikkat edin.
Javi_VM

1
vay, diğer dillerde böyle basit bir şey r'de zordur? Diyelim ki bir değişkende bir dizge var. Onu bir anahtar yapmaya çalışırsam, değişkenin değeri yerine anahtar adı olarak değişken adını seçer.
wondim

1
@wondim Bir değişkenden liste öğesi adlarını ayarlayabilirsiniz names(list) <- vector_of names, alt kümeli atama da işe yarar names(list)[1] <- "foo". Ayrıca bakınız setNames().
joran

5

Karma tablo kullanmanın (yeni bir ortam yaratmanın) probleminize çözüm olabileceğine inanıyorum. Bunu nasıl yapacağımı yazardım ama dün bunu talkstats.com'da yaptım.

Sözlüğünüz büyükse ve yalnızca iki sütun varsa, o zaman gitmenin yolu bu olabilir. Örnek R kodlu talkstats dizisinin bağlantısı:

HASH TABLO BAĞLANTISI


Note data.tableve R'nin kendi adlandırılmış vektör aramaları, bu zamandan beri hızda büyük ölçüde gelişti.
Tyler Rinker

5

Sizin durumunuzda olduğu gibi, sadece "sözlüğünüzün" aynı türden değerleri depolamasını istiyorsanız, basitçe bir vektör kullanabilir ve her bir öğeyi adlandırabilirsiniz.

> l <- c(a = 1, b = 7, f = 2)
> l
a b f 
1 7 2

"Anahtarlara" erişmek istiyorsanız, kullanın names.

> names(l)
[1] "a" "b" "f"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.