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..1e9f985 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('>')
 
