如何检查列表中是否存在整数键?

时间:2014-08-01 19:40:35

标签: r

我看过this questionthis question,但似乎都没有解决检查列表中是否存在整数键的问题。

请考虑以下示例。

mylist=list()
mylist[[5]] = 1

# How do I programmatically check whether 5 is a key for this list?
5 %in% names(mylist) # returns FALSE, because names(mylist) is NULL here.

更新:澄清,使用其他语言,如Python。以下是我尝试在R中复制的行为。

foo = {}
foo[5] = 1
if 5 in foo: # How do I say "if 5 in foo" in R?
   print foo[5]
   # Do other stuff

2 个答案:

答案 0 :(得分:2)

我认为最好使用逻辑值。这样,每个列表元素都附加了“是”或“否”。这是一个小例子。此外,如果您真的使用整数,请将L附加到数字1,否则R将不会将其识别为整数。此外,在R中,如果已知,最好用有限长度初始化列表。

> mylist <- vector("list", 3)
> mylist[[3]] <- 1
> sapply(mylist, is.null)
# [1]  TRUE  TRUE FALSE
> sapply(mylist, is.integer)
# [1] FALSE FALSE FALSE
> mylist[[3]] <- 1L
> sapply(mylist, is.integer)
# [1] FALSE FALSE  TRUE

答案 1 :(得分:0)

似乎列表不像其他语言的词典。使用整数i进行索引时,它将访问列表的第i个元素。

一些示例行为:

mylist = list()
mylist[[3]] = 2
print(mylist)
# [[1]] 
# NULL
# [[2]] 
# NULL
# [[3]]
# [1] 2

mylist[['a']] = 5
print(mylist[['a']])
# [1] 5

mylist[[4]] = 10
print(mylist[['a']])
# [1] 10

所以我认为你想在R字典中使用列表,最好只坚持使用字符串键。

alexis_laz 5 %in% which(!sapply(mylist, is.null))给出的答案,只要你确定没有值为空就行。但是字典条目通常可以为null,在这种情况下,所有字母条目都会被分解。此外,它不是特别节省内存,因为列表在使用整数键时不是好的字典替代品。如果你使用的是大整数,那么它将初始化大量的空值列表。

list1 = list()
list2 = list()
list1[[1]] = 5
list2[[1000]] = 5
print(object.size(list1))
# 96 bytes
print(object.size(list2))
# 8088 bytes