相当于R中的python dict


82

我想使R中的python字典等效。基本上,在python中,我有:

visited = {}

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

这个想法是,如果我看到了那个特定的atom_count,我就访问了[atom_count] =1。因此,如果我再次看到那个atom_count,我就不会“做东西”。Atom_Count是一个整数。

谢谢!


5
请参阅R包hash,其具有几乎类似于Python的访问功能。
汉斯W.

@Chase将花费O(n)。Dict元素访问是恒定的。
anilbey

Answers:


71

在R中,最接近python字典的是一个列表。像大多数R数据类型一样,列表可以具有一个名称属性,该属性可以使列表像一组名称/值对一样工作:

> 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中使用字典完全相同的方式来实际使用列表。


您如何以编程方式遍历这样的列表?天真的l$names(l)[1]显然失败了。我也没能l[which()]上班
3pitt

@MikePalmice除了for循环(几乎在每种语言中都有这种选择)之外,还有lapply。还有一些具有不同语法的相关事物,例如Map和,以及一个完整的软件包,其中包含许多功能性编程内容。
joran

@MikePalmice,我认为l[[names(l)[1]]应该可以。无论如何,您可以像这样进行迭代:l[[1]]无需使用名称。请注意,单括号[]将返回列表,而双括号[[]]将返回列表内的对象。
Javi_VM '18 -10-8

1
哇,用其他语言这么简单的事情在r中很难吗?假设我的变量中包含字符串。如果我尝试使其成为键,它只是选择变量名作为键名,而不是变量的值。
wondim

1
@wondim您也可以使用来设置变量的列表项名称,子集names(list) <- vector_of names分配也可以names(list)[1] <- "foo"。另请参阅setNames()
joran

5

我相信使用哈希表(创建新环境)可能是解决您的问题的方法。我会说出如何执行此操作,但昨天才在talkstats.com上输入。

如果您的词典很大并且只有两列,那么这可能是可行的方法。这是带有示例R代码的talkstats线程的链接:

哈希表链接


data.table自从这一次以来,Note和R自己命名的矢量查找的速度已大大提高。
泰勒·林克

4

如果像您的情况一样,只希望“字典”存储相同类型的值,则可以简单地使用向量,并为每个元素命名。

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

如果要访问“键”,请使用names

> names(l)
[1] "a" "b" "f"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.