RのPythondictに相当


82

Rでpythondictに相当するものを作りたいです。基本的に、pythonでは次のようになります。

visited = {}

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

アイデアは、その特定のatom_countを見た場合、[atom_count] = 1にアクセスしたことです。したがって、そのatom_countをもう一度見た場合、「DoStuff」は実行しません。Atom_Countは整数です。

ありがとう!


5
hashほぼPythonのようなアクセス関数を備えたRパッケージを参照してください。
ハンスW.

@ChaseはO(n)の費用がかかります。Dict要素へのアクセスは一定です。
anilbey

回答:


71

Rのpythondictに最も近いのは、単なるリストです。ほとんどのRデータ型と同様に、リストには、リストが名前と値のペアのセットのように機能できるようにするnames属性を含めることができます。

> 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"

ここで、通常の免責事項について説明します。これらはまったく同じではありません。違いがあります。したがって、Pythonでdictを使用するのとまったく同じように、文字通りリストを使用しようとすると、がっかりすることになります。


このようなリストをプログラムでどのように繰り返すことができますか?ナイーブはl$names(l)[1]明らかに失敗します。私もl[which()]仕事に
取り掛かる

@MikePalmiceforループは、ほとんどすべての言語のオプションの一種ですが、他にもありlapplyます。また、関数型プログラミングの多くに対応するMapパッケージ全体など、構文が異なる関連するものもあります。
joran 2017年

@MikePalmice、うまくいくl[[names(l)[1]]はずだと思います。とにかく、l[[1]]名前を使用せずに、次のように繰り返すことができます。単一の括弧[]はリストを返し、二重の括弧[[]]はリスト内のオブジェクトを返すことに注意してください。
Javi_VM 2018年

1
うわー、他の言語でのそのような単純なことは、rでは難しいですか?変数に文字列が含まれているとしましょう。これをキーにしようとすると、変数の値ではなく、変数名がキー名として選択されます。
wondim

1
@wondim変数からリストアイテム名を設定できます。names(list) <- vector_of namesサブセット化された割り当ても同様に機能しますnames(list)[1] <- "foo"。も参照してくださいsetNames()
joran

5

ハッシュテーブルの使用(新しい環境の作成)が問題の解決策になると思います。これを行う方法を入力しますが、昨日talkstats.comで入力しました。

辞書が大きく、列が2つしかない場合は、これが最適な方法かもしれません。サンプルRコードを含むtalkstatsスレッドへのリンクは次のとおりです。

ハッシュテーブルリンク


Notedata.tableとR自身の名前付きベクトルルックアップは、この時以来、速度が劇的に向上しました。
タイラーリンカー2014年

4

あなたの場合のように、「辞書」に同じタイプの値を格納したいだけの場合は、ベクトルを使用して、各要素に名前を付けることができます。

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

「キー」にアクセスする場合は、を使用しますnames

> names(l)
[1] "a" "b" "f"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.