tương đương với một dict python trong R


82

Tôi muốn tạo một lệnh tương đương với python dict trong R. Về cơ bản, trong python, tôi có:

visited = {}

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

Ý tưởng là, nếu tôi nhìn thấy atom_count cụ thể đó, tôi đã truy cập [atom_count] = 1. Vì vậy, nếu tôi nhìn thấy atom_count đó một lần nữa, tôi không "Do Stuff". Atom_Count là một số nguyên.

Cảm ơn!


5
Xem gói R hashvới các chức năng truy cập gần giống như Python của nó.
Hans W.

@Chase sẽ có giá O (n). Quyền truy cập phần tử Dict là không đổi.
anilbey 07/07/19

Câu trả lời:


71

Điều gần nhất với một lệnh python trong R chỉ đơn giản là một danh sách. Giống như hầu hết các kiểu dữ liệu R, danh sách có thể có thuộc tính tên có thể cho phép danh sách hoạt động giống như một tập hợp các cặp giá trị tên:

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

Bây giờ đối với tuyên bố từ chối trách nhiệm thông thường: chúng không hoàn toàn giống nhau; sẽ có sự khác biệt. Vì vậy, bạn sẽ thất vọng khi cố gắng sử dụng danh sách theo đúng nghĩa đen như cách bạn có thể sử dụng một câu lệnh trong python.


làm thế nào bạn có thể lập trình lặp qua một danh sách như vậy? người ngây thơ l$names(l)[1]rõ ràng là thất bại. tôi cũng đã không thể để có được l[which()]để làm việc
3pitt

@MikePalmice Ngoài forvòng lặp, là một tùy chọn trong hầu hết các ngôn ngữ xung quanh, còn có lapply. Ngoài ra còn có những thứ liên quan với các cú pháp khác nhau, chẳng hạn như Mapvà toàn bộ gói, đáp ứng cho rất nhiều công cụ lập trình chức năng.
joran

@MikePalmice, tôi nghĩ l[[names(l)[1]]nên làm việc. Dù sao, bạn chỉ có thể lặp lại như thế này: l[[1]]mà không cần sử dụng tên. Lưu ý rằng dấu ngoặc đơn []sẽ trả về một danh sách, trong khi dấu ngoặc kép [[]]sẽ trả về đối tượng bên trong danh sách.
Javi_VM

1
wow, một điều đơn giản như vậy trong các ngôn ngữ khác là khó khăn trong r? Giả sử tôi có chuỗi chứa trong một biến. Nếu tôi cố gắng đặt nó thành khóa, nó chỉ chọn tên biến làm tên khóa thay vì giá trị của biến.
wonderim

1
@wondim Bạn có thể đặt tên mục danh sách từ một biến với names(list) <- vector_of namesphép gán được gán con cũng hoạt động names(list)[1] <- "foo",. Xem thêm setNames().
joran

5

Tôi tin rằng việc sử dụng bảng băm (tạo môi trường mới) có thể là giải pháp cho vấn đề của bạn. Tôi đã tìm ra cách thực hiện việc này nhưng tôi vừa làm như vậy vào ngày hôm qua tại talkstats.com.

Nếu từ điển của bạn lớn và chỉ có hai cột thì đây có thể là cách tốt nhất. Đây là liên kết đến chuỗi talkstats với mã R mẫu:

LIÊN KẾT BẢNG HASH


Lưu ý data.tablevà tra cứu vectơ được đặt tên riêng của R đã cải thiện đáng kể về tốc độ kể từ thời điểm này.
Tyler Rinker

4

Nếu, giống như trong trường hợp của bạn, bạn chỉ muốn "từ điển" của mình lưu trữ các giá trị cùng loại, bạn có thể chỉ cần sử dụng một vectơ và đặt tên cho từng phần tử.

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

Nếu bạn muốn truy cập các "phím", hãy sử dụng names.

> names(l)
[1] "a" "b" "f"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.