Sometimes called "AssociativeArray", "Map", or "HashTable" (the latter is strictly an implementation of a dictionary). Almost all script languages, including PerlLanguage, RubyLanguage, PythonLanguage, LispLanguage, support some kind of dictionary built-in facility.

In a dictionary, you store a value with an associated key and then you may retrieve this value later using the key. There are a lot of examples. For example, in PerlLanguage you might use the built-in hash capability:

 my %english2latin = (
    sailor  => 'nauta',
    man     => 'vir',
    woman   => 'femina',
 );
 $english2latin{'dog'} = 'canis';

 foreach $key (sort keys %english2latin)
 {
   my $value = $english2latin{$key};
   print "The Latin word for $key is $value.\n";
 }

 outputs:
   The Latin word for dog is canis.
   The Latin word for man is vir.
   The Latin word for sailor is nauta.
   The Latin word for woman is femina.

----
In Smalltalk I could do it like this
	
	| dict |
	dict := (IdentityDictionary new)
				add: 'man' -> 'vir';
				add: 'woman' -> 'femina';
				add: 'sailor' -> 'nauta';
				yourself.
	dict add: 'dog' -> 'canis'.
	dict keys asSortedCollection do: 
			[:key | 
			Transcript
				cr;
				show: 'The Latin word for ';
				show: key;
				show: ' is ';
				show: (dict at: key)]

Plenty of more to write, but nevertheless

---------

In RDBMS (RelationalDatabase) terms, a dictionary has 2 columns, one of which is a primary (unique) key.
---------

''In Smalltalk, IdentityDictionary is a subclass of Dictionary.  When should I use one, and when the other?''

I just read the answer to my own question.  It is was posted a few years ago at http://wiki.squeak.org/squeak/1845 very tersely: "uses == (identity) for accessing. "   In the Squeak sources, it is used for things that must exist only once: the classes SystemDictionary and DynamicBindings.

Actually the above example can also works fine with a Dictionary, and does not need an IdentityDictionary.

	dict2 := (Dictionary new)
				add: 'man' -> 'vir';
				add: 'woman' -> 'femina';
				add: 'sailor' -> 'nauta';
				yourself. 
	dict2 add: 'dog' -> 'canis'. 'dog'->'canis'
	dict2 keys asSortedCollection do: 
			[:key | 
			Transcript
				cr;
				show: 'The Latin word for ';
				show: key;
				show: ' is ';
				show: (dict2 at: key)] 

One difference I spotted from browsing the Squeak sources, is that in the Dictionary, the entries are identified by the Collection>>hash Smalltalk method.  However, in the IdentityDictionary, that is replaced with ProtoObject>>identityHash, which is a virtual machine primitive.

-------

PythonLanguage is based heavily on its dictionaries: every object has an underlying dictionary mapping to its attributes, which may be accessed through the __dict__ attribute.

	class ExampleObject:
		spam = "example"

	obj = ExampleObject()
	print obj.spam # prints "example"
	print obj.__dict__["spam"] # also prints "example"

-------
Not to be confused with DataDictionary.
--------
CategoryDataStructure