diff --git a/Demo/cgi/cgi2.py b/Demo/cgi/cgi2.py
index 239fb6b..1d5822c 100755
--- a/Demo/cgi/cgi2.py
+++ b/Demo/cgi/cgi2.py
@@ -14,7 +14,7 @@
         print("<h1>No Form Keys</h1>")
     else:
         print("<h1>Form Keys</h1>")
-        for key in list(form.keys()):
+        for key in form.keys():
             value = form[key].value
             print("<p>", cgi.escape(key), ":", cgi.escape(value))
 
diff --git a/Demo/classes/Dbm.py b/Demo/classes/Dbm.py
index fd73571..ecc117d 100755
--- a/Demo/classes/Dbm.py
+++ b/Demo/classes/Dbm.py
@@ -12,7 +12,7 @@
 
     def __repr__(self):
         s = ''
-        for key in list(self.keys()):
+        for key in self.keys():
             t = repr(key) + ': ' + repr(self[key])
             if s: t = ', ' + t
             s = s + t
@@ -32,7 +32,7 @@
 
     def keys(self):
         res = []
-        for key in list(self.db.keys()):
+        for key in self.db.keys():
             res.append(eval(key))
         return res
 
diff --git a/Demo/metaclasses/Enum.py b/Demo/metaclasses/Enum.py
index 8d402db..eb52d79 100644
--- a/Demo/metaclasses/Enum.py
+++ b/Demo/metaclasses/Enum.py
@@ -42,7 +42,7 @@
         self.__name__ = name
         self.__bases__ = bases
         self.__dict = {}
-        for key, value in list(dict.items()):
+        for key, value in dict.items():
             self.__dict[key] = EnumInstance(name, key, value)
 
     def __getattr__(self, name):
@@ -80,7 +80,7 @@
             s = s + '(' + string.join([x.__name__ for x in self.__bases__], ", ") + ')'
         if self.__dict:
             list = []
-            for key, value in list(self.__dict.items()):
+            for key, value in self.__dict.items():
                 list.append("%s: %s" % (key, int(value)))
             s = "%s: {%s}" % (s, string.join(list, ", "))
         return s
diff --git a/Demo/newmetaclasses/Enum.py b/Demo/newmetaclasses/Enum.py
index 0f7f913..99b6fe8 100644
--- a/Demo/newmetaclasses/Enum.py
+++ b/Demo/newmetaclasses/Enum.py
@@ -20,7 +20,7 @@
     def __init__(cls, name, bases, dict):
         super(EnumMetaclass, cls).__init__(name, bases, dict)
         cls._members = []
-        for attr in list(dict.keys()):
+        for attr in dict.keys():
             if not (attr.startswith('__') and attr.endswith('__')):
                 enumval = EnumInstance(name, attr, dict[attr])
                 setattr(cls, attr, enumval)
diff --git a/Demo/pdist/cmdfw.py b/Demo/pdist/cmdfw.py
index 7bcb461..ec854b1 100755
--- a/Demo/pdist/cmdfw.py
+++ b/Demo/pdist/cmdfw.py
@@ -104,9 +104,7 @@
             c = c.__bases__[0]
         if docstrings:
             print("where subcommand can be:")
-            names = list(docstrings.keys())
-            names.sort()
-            for name in names:
+            for name in sorted(docstrings.keys()):
                 print(docstrings[name])
         if self.PostUsageMessage:
             print(self.PostUsageMessage)
diff --git a/Demo/pdist/cmptree.py b/Demo/pdist/cmptree.py
index d6962e9..1e9f985e 100755
--- a/Demo/pdist/cmptree.py
+++ b/Demo/pdist/cmptree.py
@@ -89,7 +89,7 @@
                 else:
                     print("same mtime but different sum?!?!", end=' ')
                 print()
-    for name in list(lsumdict.keys()):
+    for name in lsumdict.keys():
         if not list(rsumdict.keys()):
             print(repr(name), "only locally", end=' ')
             fl()
diff --git a/Demo/pdist/cvslib.py b/Demo/pdist/cvslib.py
index 8ccb616..78e4fbb 100755
--- a/Demo/pdist/cvslib.py
+++ b/Demo/pdist/cvslib.py
@@ -223,15 +223,12 @@
         f.close()
 
     def getlocalfiles(self):
-        list = list(self.entries.keys())
+        entries_keys = set(self.entries.keys())
         addlist = os.listdir(os.curdir)
         for name in addlist:
-            if name in list:
-                continue
             if not self.ignored(name):
-                list.append(name)
-        list.sort()
-        for file in list:
+                entries_keys.add(name)
+        for file in sorted(entries_keys):
             try:
                 e = self.entries[file]
             except KeyError:
@@ -257,19 +254,17 @@
         print('-'*50)
 
     def keys(self):
-        keys = list(self.entries.keys())
-        keys.sort()
-        return keys
+        return sorted(self.entries.keys())
 
     def values(self):
         def value(key, self=self):
             return self.entries[key]
-        return list(map(value, list(self.keys())))
+        return [value(k) for k in self.keys()]
 
     def items(self):
         def item(key, self=self):
             return (key, self.entries[key])
-        return list(map(item, list(self.keys())))
+        return [item(k) for k in self.keys()]
 
     def cvsexists(self, file):
         file = os.path.join("CVS", file)
diff --git a/Demo/pdist/rrcs.py b/Demo/pdist/rrcs.py
index 8d0ef03..647ecc5 100755
--- a/Demo/pdist/rrcs.py
+++ b/Demo/pdist/rrcs.py
@@ -71,11 +71,9 @@
     x.unlock(fn)
 
 def info(x, copts, fn):
-    dict = x.info(fn)
-    keys = list(dict.keys())
-    keys.sort()
-    for key in keys:
-        print(key + ':', dict[key])
+    info_dict = x.info(fn)
+    for key in sorted(info_dict.keys()):
+        print(key + ':', info_dict[key])
     print('='*70)
 
 def head(x, copts, fn):
diff --git a/Demo/pdist/server.py b/Demo/pdist/server.py
index 98a4741..7e77971 100755
--- a/Demo/pdist/server.py
+++ b/Demo/pdist/server.py
@@ -101,9 +101,7 @@
 
     def _listmethods(self, cl=None):
         if not cl: cl = self.__class__
-        names = list(cl.__dict__.keys())
-        names = [x for x in names if x[0] != '_']
-        names.sort()
+        names = sorted([x for x in cl.__dict__.keys() if x[0] != '_'])
         for base in cl.__bases__:
             basenames = self._listmethods(base)
             basenames = list(filter(lambda x, names=names: x not in names, basenames))
diff --git a/Demo/scripts/ftpstats.py b/Demo/scripts/ftpstats.py
index d0a0824..19ad392 100755
--- a/Demo/scripts/ftpstats.py
+++ b/Demo/scripts/ftpstats.py
@@ -106,9 +106,7 @@
     n = len(title)
     print('='*((70-n)/2), title, '='*((71-n)/2))
     list = []
-    keys = list(dict.keys())
-    keys.sort()
-    for key in keys:
+    for key in sorted(dict.keys()):
         n = len(str(key))
         list.append((len(dict[key]), key))
     maxkeylength = 0
@@ -128,8 +126,7 @@
     n = len(title)
     print('='*((70-n)/2), title, '='*((71-n)/2))
     list = []
-    keys = list(dict.keys())
-    for key in keys:
+    for key in dict.keys():
         list.append((-len(dict[key]), key))
     list.sort()
     for count, key in list[:maxitems]:
diff --git a/Demo/scripts/markov.py b/Demo/scripts/markov.py
index a91e359..3dc57ce 100755
--- a/Demo/scripts/markov.py
+++ b/Demo/scripts/markov.py
@@ -87,7 +87,7 @@
         return
     if debug: print('done.')
     if debug > 1:
-        for key in list(m.trans.keys()):
+        for key in m.trans.keys():
             if key is None or len(key) < histsize:
                 print(repr(key), m.trans[key])
         if histsize == 0: print(repr(''), m.trans[''])
diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index 4635f1d..7038380 100755
--- a/Demo/scripts/newslist.py
+++ b/Demo/scripts/newslist.py
@@ -172,10 +172,9 @@
         createpage(p[1:], tree, p)
         return
 
-    kl = list(tree.keys())
+    kl = sorted(tree.keys())
 
     if l > 1:
-        kl.sort()
         if indent > 0:
             # Create a sub-list
             f.write('<LI>'+p[1:]+'\n<UL>')
diff --git a/Demo/threads/Coroutine.py b/Demo/threads/Coroutine.py
index 6bf788b..4a155f8 100644
--- a/Demo/threads/Coroutine.py
+++ b/Demo/threads/Coroutine.py
@@ -127,7 +127,7 @@
         if self.killed:
             raise TypeError('kill() called on dead coroutines')
         self.killed = 1
-        for coroutine in list(self.invokedby.keys()):
+        for coroutine in self.invokedby.keys():
             coroutine.resume()
 
     def back(self, data=None):
diff --git a/Demo/tix/samples/OptMenu.py b/Demo/tix/samples/OptMenu.py
index 2cf625a..1d39420 100755
--- a/Demo/tix/samples/OptMenu.py
+++ b/Demo/tix/samples/OptMenu.py
@@ -40,7 +40,7 @@
     #        global variables "demo_opt_from" and "demo_opt_to". Otherwise
     #        the OptionMenu widget will complain about "unknown options"!
     #
-    for opt in list(options.keys()):
+    for opt in options.keys():
         from_file.add_command(opt, label=options[opt])
         to_file.add_command(opt, label=options[opt])
 
diff --git a/Demo/tkinter/guido/AttrDialog.py b/Demo/tkinter/guido/AttrDialog.py
index 98bdd14..921c105 100755
--- a/Demo/tkinter/guido/AttrDialog.py
+++ b/Demo/tkinter/guido/AttrDialog.py
@@ -112,7 +112,7 @@
     def addchoices(self):
         self.choices = {}
         list = []
-        for k, dc in list(self.options.items()):
+        for k, dc in self.options.items():
             list.append((k, dc))
         list.sort()
         for k, (d, c) in list:
@@ -260,7 +260,7 @@
             classes = {}
             for c in (self.classes,
                       self.addclasses[self.klass]):
-                for k in list(c.keys()):
+                for k in c.keys():
                     classes[k] = c[k]
             self.classes = classes
 
@@ -273,7 +273,7 @@
     def update(self):
         self.current = {}
         self.options = {}
-        for k, v in list(self.configuration.items()):
+        for k, v in self.configuration.items():
             if len(v) > 4:
                 self.current[k] = v[4]
                 self.options[k] = v[3], v[2] # default, klass
diff --git a/Demo/xml/elem_count.py b/Demo/xml/elem_count.py
index a2b4647..e083e64 100644
--- a/Demo/xml/elem_count.py
+++ b/Demo/xml/elem_count.py
@@ -15,7 +15,7 @@
         self._attrs = self._attrs + len(attrs)
         self._elem_types[name] = self._elem_types.get(name, 0) + 1
 
-        for name in list(attrs.keys()):
+        for name in attrs.keys():
             self._attr_types[name] = self._attr_types.get(name, 0) + 1
 
     def endDocument(self):
@@ -23,11 +23,11 @@
         print("There were", self._attrs, "attributes.")
 
         print("---ELEMENT TYPES")
-        for pair in  list(self._elem_types.items()):
+        for pair in  self._elem_types.items():
             print("%20s %d" % pair)
 
         print("---ATTRIBUTE TYPES")
-        for pair in  list(self._attr_types.items()):
+        for pair in  self._attr_types.items():
             print("%20s %d" % pair)
 
 
diff --git a/Demo/xml/roundtrip.py b/Demo/xml/roundtrip.py
index b0e131e..8d7d437 100644
--- a/Demo/xml/roundtrip.py
+++ b/Demo/xml/roundtrip.py
@@ -22,7 +22,7 @@
 
     def startElement(self, name, attrs):
         self._out.write('<' + name)
-        for (name, value) in list(attrs.items()):
+        for (name, value) in attrs.items():
             self._out.write(' %s="%s"' % (name, saxutils.escape(value)))
         self._out.write('>')
 
