diff --git a/scapy/ansmachine.py b/scapy/ansmachine.py
index 2a90adcc65780577f9dac4fc38faf41efa2b1cf8..d73bd421c323f5f17817e1b4855f9008ba1da824 100644
--- a/scapy/ansmachine.py
+++ b/scapy/ansmachine.py
@@ -68,13 +68,13 @@ class AnsweringMachine(object):
     def parse_all_options(self, mode, kargs):
         sniffopt = {}
         sendopt = {}
-        for k in kargs.keys():            
+        for k in kargs.keys():  # use .keys(): kargs is modified in the loop
             if k in self.sniff_options_list:
                 sniffopt[k] = kargs[k]
             if k in self.send_options_list:
                 sendopt[k] = kargs[k]
             if k in self.sniff_options_list+self.send_options_list:
-                del(kargs[k])
+                del kargs[k]
         if mode != 2 or kargs:
             if mode == 1:
                 self.optam0 = kargs
diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py
index c4860da46e8603308f4d820ef2da40309ac08a84..44f3569b939809e68b667f9931f4647d59316923 100755
--- a/scapy/arch/windows/__init__.py
+++ b/scapy/arch/windows/__init__.py
@@ -308,7 +308,7 @@ class NetworkInterfaceDict(UserDict):
     def show(self, resolve_mac=True):
         """Print list of available network interfaces in human readable form"""
         print "%s  %s  %s  %s" % ("INDEX".ljust(5), "IFACE".ljust(35), "IP".ljust(15), "MAC")
-        for iface_name in sorted(self.data.keys()):
+        for iface_name in sorted(self.data):
             dev = self.data[iface_name]
             mac = dev.mac
             if resolve_mac:
@@ -568,9 +568,9 @@ def sndrcv(pks, pkt, timeout = 2, inter = 0, verbose=None, chainCC=0, retry=0, m
         finally:
             pass
 
-        remain = list(itertools.chain(*[ i for i in hsent.values() ]))
+        remain = list(itertools.chain(*hsent.itervalues()))
         if multi:
-            remain = [ p for p in remain if not hasattr(p, '_answered')]
+            remain = [p for p in remain if not hasattr(p, '_answered')]
             
         if autostop and len(remain) > 0 and len(remain) != len(tobesent):
             retry = autostop
diff --git a/scapy/asn1/mib.py b/scapy/asn1/mib.py
index c8065f00d62efb3493658fff38bbc32db8a765f3..c3aa59c1d8c861c912ea982381eb7ee7a4497e4c 100644
--- a/scapy/asn1/mib.py
+++ b/scapy/asn1/mib.py
@@ -32,7 +32,7 @@ class MIBDict(DADict):
             x += "."
         max=0
         root="."
-        for k in self.keys():
+        for k in self.iterkeys():
             if x.startswith(self[k]+"."):
                 if max < len(self[k]):
                     max = len(self[k])
@@ -51,8 +51,8 @@ class MIBDict(DADict):
         xl[p] = self[xl[p]] 
         return ".".join(xl[p:])
     def _make_graph(self, other_keys=[], **kargs):
-        nodes = [(k,self[k]) for k in self.keys()]
-        oids = [self[k] for k in self.keys()]
+        nodes = [(k, self[k]) for k in self.iterkeys()]
+        oids = [self[k] for k in self.iterkeys()]
         for k in other_keys:
             if k not in oids:
                 nodes.append(self.oidname(k),k)
@@ -114,7 +114,7 @@ def mib_register(ident, value, the_mib, unresolved):
 def load_mib(filenames):
     the_mib = {'iso': ['1']}
     unresolved = {}
-    for k in conf.mib.keys():
+    for k in conf.mib.iterkeys():
         mib_register(k, conf.mib[k].split("."), the_mib, unresolved)
 
     if type(filenames) is str:
diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py
index 0994e4a9afcd870cbf1856e31d980ac72f5e5294..568022afada518efaf55b3d22bdecf01d775712c 100644
--- a/scapy/asn1fields.py
+++ b/scapy/asn1fields.py
@@ -169,8 +169,8 @@ class ASN1F_enum_INTEGER(ASN1F_INTEGER):
             keys = xrange(len(enum))
         else:
             keys = enum.keys()
-        if filter(lambda x: type(x) is str, keys):
-            i2s,s2i = s2i,i2s
+        if any(isinstance(x, basestring) for x in keys):
+            i2s, s2i = s2i, i2s
         for k in keys:
             i2s[k] = enum[k]
             s2i[enum[k]] = k
@@ -470,7 +470,7 @@ class ASN1F_CHOICE(ASN1F_field):
                                 explicit_tag=exp)
         return BER_tagging_enc(s, explicit_tag=self.explicit_tag)
     def randval(self):
-        return RandChoice(*map(lambda x:fuzz(x()), self.choice.values()))
+        return RandChoice(*(fuzz(x()) for x in self.choices.itervalues()))
 
 class ASN1F_PACKET(ASN1F_field):
     holds_packets = 1
diff --git a/scapy/automaton.py b/scapy/automaton.py
index 69651c50b68a741d177a070eb55854f794a10359..1dde1dacfbad1e159b904309d8f3cc2753e9f5f7 100644
--- a/scapy/automaton.py
+++ b/scapy/automaton.py
@@ -291,7 +291,7 @@ class Automaton_metaclass(type):
                 se += '\t"%s" [ style=filled, fillcolor=red, shape=octagon ];\n' % st.atmt_state
         s += se
 
-        for st in self.states.values():
+        for st in self.states.itervalues():
             for n in st.atmt_origfunc.func_code.co_names+st.atmt_origfunc.func_code.co_consts:
                 if n in self.states:
                     s += '\t"%s" -> "%s" [ color=green ];\n' % (st.atmt_state,n)
diff --git a/scapy/config.py b/scapy/config.py
index 95fb43d2c028e51efa2c5722bce55cb61f7a6128..7f99e3d88b79f02d106084df98073871a7903c08 100755
--- a/scapy/config.py
+++ b/scapy/config.py
@@ -23,11 +23,10 @@ class ConfClass(object):
     def __repr__(self):
         return str(self)
     def __str__(self):
-        s=""
+        s = ""
         keys = self.__class__.__dict__.copy()
         keys.update(self.__dict__)
-        keys = keys.keys()
-        keys.sort()
+        keys = sorted(keys)
         for i in keys:
             if i[0] != "_":
                 r = repr(getattr(self, i))
diff --git a/scapy/contrib/openflow3.py b/scapy/contrib/openflow3.py
index 0dc31306c823ab5454a00ad1df38b29ab60576fb..5df721adab6f75220e8639c4d2bbdec5b42e355f 100755
--- a/scapy/contrib/openflow3.py
+++ b/scapy/contrib/openflow3.py
@@ -553,7 +553,7 @@ class OXMPacketListField(PacketListField):
             for oxm in fix_val:
                 f = 2*oxm.field
                 fix_index = list(self.index)
-                while f in need_prereq.keys():
+                while f in need_prereq:
                 # this loop enables a small recursion
                 # e.g. ipv6_nd<--icmpv6<--ip_proto<--eth_type
                     prereq = need_prereq[f]
diff --git a/scapy/contrib/ppi_geotag.py b/scapy/contrib/ppi_geotag.py
index add1a67513ecec388f20d8cf0a7a11a8d35c2e2b..bb7f321dd36b1952e266808f55d8e79ff4782671 100644
--- a/scapy/contrib/ppi_geotag.py
+++ b/scapy/contrib/ppi_geotag.py
@@ -260,11 +260,9 @@ class HCSIAppField(StrFixedLenField):
         return StrFixedLenField.__init__(self, name, default, length=60)
 
 def _FlagsList(myfields):
-    flags = []
-    for i in xrange(32):
-        flags.append("Reserved%02d" % i)
-    for i in myfields.keys():
-        flags[i] = myfields[i]
+    flags = ["Reserved%02d" % i for i in xrange(32)]
+    for i, value in myfields.iteritems():
+        flags[i] = value
     return flags
 
 # Define all geolocation-tag flags lists
diff --git a/scapy/crypto/cert.py b/scapy/crypto/cert.py
index 1d383650bc7d89e88a51c0d2e2d6197951901f05..c89656a58c5ffe9e1d1ca5ddaca1a3ed6c522d92 100644
--- a/scapy/crypto/cert.py
+++ b/scapy/crypto/cert.py
@@ -159,7 +159,7 @@ def pkcs_mgf1(mgfSeed, maskLen, h):
     """
 
     # steps are those of Appendix B.2.1
-    if not _hashFuncParams.has_key(h):
+    if h not in _hashFuncParams:
         warning("pkcs_mgf1: invalid hash (%s) provided")
         return None
     hLen = _hashFuncParams[h][0]
@@ -520,7 +520,7 @@ class _EncryptAndVerify:
         mLen = len(M)
         if h is None:
             h = "sha1"
-        if not _hashFuncParams.has_key(h):
+        if h not in _hashFuncParams:
             warning("Key._rsaes_oaep_encrypt(): unknown hash function %s.", h)
             return None
         hLen = _hashFuncParams[h][0]
@@ -641,7 +641,7 @@ class _EncryptAndVerify:
         # Set default parameters if not provided
         if h is None: # By default, sha1
             h = "sha1"
-        if not _hashFuncParams.has_key(h):
+        if h not in _hashFuncParams:
             warning("Key._rsassa_pss_verify(): unknown hash function "
                     "provided (%s)" % h)
             return False
@@ -889,7 +889,7 @@ class _DecryptAndSignMethods(OSSLHelper):
                                                     # 1.a) is not done
         if h is None:
             h = "sha1"
-        if not _hashFuncParams.has_key(h):
+        if h not in _hashFuncParams:
             warning("Key._rsaes_oaep_decrypt(): unknown hash function %s.", h)
             return None
         hLen = _hashFuncParams[h][0]
@@ -1042,7 +1042,7 @@ class _DecryptAndSignMethods(OSSLHelper):
         # Set default parameters if not provided
         if h is None: # By default, sha1
             h = "sha1"
-        if not _hashFuncParams.has_key(h):
+        if h not in _hashFuncParams:
             warning("Key._rsassa_pss_sign(): unknown hash function "
                     "provided (%s)" % h)
             return None
@@ -1940,7 +1940,7 @@ class Cert(OSSLHelper, _EncryptAndVerify):
         unenc = unenc[pos+1:]
 
         found = None
-        for k in _hashFuncParams.keys():
+        for k in _hashFuncParams:
             if self.sigAlg.startswith(k):
                 found = k
                 break
diff --git a/scapy/dadict.py b/scapy/dadict.py
index dcfd2a775ed9bf90a5f1c6e5299aad3b522bb1a1..f50ccfb1134f10bfa221bc3685c34c1491fae59e 100644
--- a/scapy/dadict.py
+++ b/scapy/dadict.py
@@ -83,5 +83,6 @@ class DADict:
                 r += p
         return r
     def keys(self):
-        return filter(lambda x:x and x[0]!="_", self.__dict__.keys())
-        
+        return list(self.iterkeys())
+    def iterkeys(self):
+        return (x for x in self.__dict__ if x and x[0] != "_")
diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py
index ed85cf181a2baca9e6e0c767c14140f1860af799..9abbf566291cf0bae44fe8b6a7d1a2c64edb9208 100644
--- a/scapy/layers/dns.py
+++ b/scapy/layers/dns.py
@@ -125,8 +125,8 @@ class DNSRRField(StrField):
         if type in [2, 3, 4, 5]:
             rr.rdata = DNSgetstr(s,p)[0]
             del(rr.rdlen)
-        elif type in dnsRRdispatcher.keys():
-            rr = dnsRRdispatcher[type]("\x00"+ret+s[p:p+rdlen])
+        elif type in DNSRR_DISPATCHER:
+            rr = DNSRR_DISPATCHER[type]("\x00"+ret+s[p:p+rdlen])
 	else:
           del(rr.rdlen)
         
@@ -591,22 +591,21 @@ class DNSRRNSEC3PARAM(_DNSRRdummy):
 		  ]
 
 
-dnssecclasses = [ DNSRROPT, DNSRRRSIG, DNSRRDLV, DNSRRDNSKEY, DNSRRNSEC, DNSRRDS, DNSRRNSEC3, DNSRRNSEC3PARAM ]
+DNSRR_DISPATCHER = {
+    41: DNSRROPT,        # RFC 1671
+    43: DNSRRDS,         # RFC 4034
+    46: DNSRRRSIG,       # RFC 4034
+    47: DNSRRNSEC,       # RFC 4034
+    48: DNSRRDNSKEY,     # RFC 4034
+    50: DNSRRNSEC3,      # RFC 5155
+    51: DNSRRNSEC3PARAM, # RFC 5155
+    32769: DNSRRDLV,     # RFC 4431
+}
+
+DNSSEC_CLASSES = tuple(DNSRR_DISPATCHER.itervalues())
 
 def isdnssecRR(obj):
-    list = [ isinstance (obj, cls) for cls in dnssecclasses ]
-    return reduce(lambda x,y: x or y, list)
-
-dnsRRdispatcher = {     #6: DNSRRSOA,
-                       41: DNSRROPT,        # RFC 1671
-                       43: DNSRRDS,         # RFC 4034
-                       46: DNSRRRSIG,       # RFC 4034
-                       47: DNSRRNSEC,       # RFC 4034
-                       48: DNSRRDNSKEY,     # RFC 4034
-                       50: DNSRRNSEC3,      # RFC 5155
-                       51: DNSRRNSEC3PARAM, # RFC 5155
-                    32769: DNSRRDLV         # RFC 4431
-                   }
+    return isinstance(obj, DNSSEC_CLASSES)
 
 class DNSRR(Packet):
     name = "DNS Resource Record"
diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py
index 1807d19d6eb3a1f555803a706a7e97452121a6c0..4aec65a0b053ac71b675d322f443be38f762dd17 100644
--- a/scapy/layers/inet.py
+++ b/scapy/layers/inet.py
@@ -1004,14 +1004,14 @@ class TracerouteResult(SndRcvList):
             if d not in trace:
                 trace[d] = {}
             trace[d][s[IP].ttl] = r[IP].src, ICMP not in r
-        for k in trace.values():
-            m = filter(lambda x:k[x][1], k.keys())
-            if not m:
+        for k in trace.itervalues():
+            try:
+                m = min(x for x, y in k.itervalues() if y[1])
+            except ValueError:
                 continue
-            m = min(m)
-            for l in k.keys():
+            for l in k.keys():  # use .keys(): k is modified in the loop
                 if l > m:
-                    del(k[l])
+                    del k[l]
         return trace
 
     def trace3D(self):
@@ -1049,8 +1049,7 @@ class TracerouteResult(SndRcvList):
         for i in trace:
             tr = trace[i]
             tr3d[i] = []
-            ttl = tr.keys()
-            for t in xrange(1,max(ttl)+1):
+            for t in xrange(1, max(tr) + 1):
                 if t not in rings:
                     rings[t] = []
                 if t in tr:
@@ -1074,12 +1073,12 @@ class TracerouteResult(SndRcvList):
                 s = IPsphere(pos=((l-1)*visual.cos(2*i*visual.pi/l),(l-1)*visual.sin(2*i*visual.pi/l),2*t),
                              ip = r[i][0],
                              color = col)
-                for trlst in tr3d.values():
+                for trlst in tr3d.itervalues():
                     if t <= len(trlst):
                         if trlst[t-1] == i:
                             trlst[t-1] = s
         forecol = colgen(0.625, 0.4375, 0.25, 0.125)
-        for trlst in tr3d.values():
+        for trlst in tr3d.itervalues():
             col = forecol.next()
             start = (0,0,0)
             for ip in trlst:
@@ -1174,7 +1173,7 @@ class TracerouteResult(SndRcvList):
         for trace_id in rt:
             trace = rt[trace_id]
             loctrace = []
-            for i in xrange(max(trace.keys())):
+            for i in xrange(max(trace)):
                 ip = trace.get(i,None)
                 if ip is None:
                     continue
@@ -1259,8 +1258,7 @@ class TracerouteResult(SndRcvList):
         bhip = {}
         for rtk in rt:
             trace = rt[rtk]
-            k = trace.keys()
-            for n in xrange(min(k), max(k)):
+            for n in xrange(min(trace), max(trace)):
                 if not trace.has_key(n):
                     trace[n] = unknown_label.next()
             if not ports_done.has_key(rtk):
@@ -1279,7 +1277,7 @@ class TracerouteResult(SndRcvList):
                 blackholes.append(bh)
     
         # Find AS numbers
-        ASN_query_list = dict.fromkeys(map(lambda x:x.rsplit(" ",1)[0],ips)).keys()
+        ASN_query_list = set(x.rsplit(" ",1)[0] for x in ips)
         if ASres is None:            
             ASNlist = []
         else:
@@ -1352,10 +1350,10 @@ class TracerouteResult(SndRcvList):
             s += "#---[%s\n" % `rtk`
             s += '\t\tedge [color="#%s%s%s"];\n' % forecolorlist.next()
             trace = rt[rtk]
-            k = trace.keys()
-            for n in xrange(min(k), max(k)):
+            maxtrace = max(trace)
+            for n in xrange(min(trace), maxtrace):
                 s += '\t%s ->\n' % trace[n]
-            s += '\t%s;\n' % trace[max(k)]
+            s += '\t%s;\n' % trace[maxtrace]
     
         s += "}\n";
         self.graphdef = s
diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py
index 763b916720b2687d77512d796d8722c10564a299..a0ce6b3207aa2dd918e62be9474d12182cd52868 100644
--- a/scapy/layers/inet6.py
+++ b/scapy/layers/inet6.py
@@ -2919,14 +2919,14 @@ class TracerouteResult6(TracerouteResult):
 
             trace[d][s[IPv6].hlim] = r[IPv6].src, t
 
-        for k in trace.values():
-            m = filter(lambda x: k[x][1], k.keys())
-            if not m:
+        for k in trace.itervalues():
+            try:
+                m = min(x for x, y in k.itervalues() if y[1])
+            except ValueError:
                 continue
-            m = min(m)
-            for l in k.keys():
+            for l in k.keys():  # use .keys(): k is modified in the loop
                 if l > m:
-                    del(k[l])
+                    del k[l]
 
         return trace
 
diff --git a/scapy/main.py b/scapy/main.py
index 149ac6e47ef9249f218966fdf719777138d8713e..63c615c11db1ad1efd7b1ebdce314257163aa217 100644
--- a/scapy/main.py
+++ b/scapy/main.py
@@ -204,13 +204,13 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20):
             def global_matches(self, text):
                 matches = []
                 n = len(text)
-                for lst in [dir(__builtin__), session.keys()]:
+                for lst in [dir(__builtin__), session]:
                     for word in lst:
                         if word[:n] == text and word != "__builtins__":
                             matches.append(word)
                 return matches
-        
-    
+
+
             def attr_matches(self, text):
                 m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text)
                 if not m:
diff --git a/scapy/modules/nmap.py b/scapy/modules/nmap.py
index 50abec1db37b251a2e740bad8362bc54972df720..4ff1a56a68c22b2c82cc6a4fac1992a6315d59cb 100644
--- a/scapy/modules/nmap.py
+++ b/scapy/modules/nmap.py
@@ -111,16 +111,16 @@ def nmap_udppacket_sig(S,T):
 
 def nmap_match_one_sig(seen, ref):
     c = 0
-    for k in seen.keys():
-        if ref.has_key(k):
-            if seen[k] in ref[k].split("|"):
+    for k, v in seen.iteritems():
+        if k in ref:
+            if v in ref[k].split("|"):
                 c += 1
     if c == 0 and seen.get("Resp") == "N":
         return 0.7
     else:
-        return 1.0*c/len(seen.keys())
-        
-        
+        return float(c) / len(seen)
+
+
 def nmap_sig(target, oport=80, cport=81, ucport=1):
     res = {}
 
@@ -167,10 +167,10 @@ def nmap_search(sigs):
     guess = 0,[]
     for os,fp in nmap_kdb.get_base():
         c = 0.0
-        for t in sigs.keys():
+        for t, v in sigs.itervalues():
             if t in fp:
-                c += nmap_match_one_sig(sigs[t], fp[t])
-        c /= len(sigs.keys())
+                c += nmap_match_one_sig(v, fp[t])
+        c /= len(sigs)
         if c > guess[0]:
             guess = c,[ os ]
         elif c == guess[0]:
@@ -194,7 +194,7 @@ def nmap_sig2txt(sig):
               "Resp", "DF", "W", "ACK", "Flags", "Ops",
               "TOS", "IPLEN", "RIPTL", "RID", "RIPCK", "UCK", "ULEN", "DAT" ]
     txt=[]
-    for i in sig.keys():
+    for i in sig:
         if i not in torder:
             torder.append(i)
     for t in torder:
diff --git a/scapy/packet.py b/scapy/packet.py
index a87fc42b4b319d237a73e9fc8110d37f3e68f34b..afe5e4da38fb16ebd8a73b8cdbc82c733974f036 100644
--- a/scapy/packet.py
+++ b/scapy/packet.py
@@ -94,8 +94,8 @@ class Packet(BasePacket):
             self.dissect(_pkt)
             if not _internal:
                 self.dissection_done(self)
-        for f in fields.keys():
-            self.fields[f] = self.get_field(f).any2i(self,fields[f])
+        for f, v in fields.iteritems():
+            self.fields[f] = self.get_field(f).any2i(self, v)
         if type(post_transform) is list:
             self.post_transforms = post_transform
         elif post_transform is None:
@@ -629,8 +629,8 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
         for t in self.aliastypes:
             for fval, cls in t.payload_guess:
                 ok = 1
-                for k in fval.keys():
-                    if not hasattr(self, k) or fval[k] != self.getfieldval(k):
+                for k, v in fval.iteritems():
+                    if not hasattr(self, k) or v != self.getfieldval(k):
                         ok = 0
                         break
                 if ok:
@@ -643,12 +643,12 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
 
     def hide_defaults(self):
         """Removes fields' values that are the same as default values."""
-        for k in self.fields.keys():
-            if self.default_fields.has_key(k):
-                if self.default_fields[k] == self.fields[k]:
-                    del(self.fields[k])
+        for k, v in self.fields.items():  # use .items(): self.fields is modified in the loop
+            if k in self.default_fields:
+                if self.default_fields[k] == v:
+                    del self.fields[k]
         self.payload.hide_defaults()
-            
+
     def clone_with(self, payload=None, **kargs):
         pkt = self.__class__()
         pkt.explicit = 1
@@ -696,9 +696,9 @@ Creates an EPS file describing a packet. If filename is not provided a temporary
             todo = []
             done = self.fields
         else:
-            todo = [ k for (k,v) in itertools.chain(self.default_fields.iteritems(),
-                                                    self.overloaded_fields.iteritems())
-                     if isinstance(v, VolatileValue) ] + self.fields.keys()
+            todo = [k for (k,v) in itertools.chain(self.default_fields.iteritems(),
+                                                   self.overloaded_fields.iteritems())
+                    if isinstance(v, VolatileValue)] + self.fields.keys()
             done = {}
         return loop(todo, done)
 
diff --git a/scapy/plist.py b/scapy/plist.py
index 987d39db105d3cd8364159a11837cd0faa772b58..5e3fdea5afc679e58b990de8ad403bd6890c3fb1 100644
--- a/scapy/plist.py
+++ b/scapy/plist.py
@@ -363,16 +363,17 @@ lfilter: truth function to apply to each packet to decide whether it will be dis
             return 2+math.log(n)/4.0
 
         def minmax(x):
-            m,M = min(x),max(x)
+            m, M = reduce(lambda a, b: (min(a[0], b[0]), max(a[1], b[1])),
+                          ((a, a) for a in x))
             if m == M:
                 m = 0
             if M == 0:
                 M = 1
-            return m,M
+            return m, M
 
-        mins,maxs = minmax(map(lambda (x,y): x, sl.values()))
-        mine,maxe = minmax(map(lambda (x,y): x, el.values()))
-        mind,maxd = minmax(dl.values())
+        mins, maxs = minmax(x for x, _ in sl.itervalues())
+        mine, maxe = minmax(x for x, _ in el.itervalues())
+        mind, maxd = minmax(dl.itervalues())
     
         gr = 'digraph "afterglow" {\n\tedge [len=2.5];\n'
 
diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py
index ba921d2a2e65b9030567e40e7285c960b4a88d1b..04dabcb8a34d5897d3f739f28685789feede6656 100644
--- a/scapy/sendrecv.py
+++ b/scapy/sendrecv.py
@@ -8,6 +8,7 @@ Functions to send and receive packets.
 """
 
 import cPickle,os,sys,time,subprocess
+import itertools
 from select import select
 from data import *
 import arch
@@ -180,10 +181,10 @@ def sndrcv(pks, pkt, timeout = None, inter = 0, verbose=None, chainCC=0, retry=0
             if pid == 0:
                 os._exit(0)
 
-        remain = reduce(list.__add__, hsent.values(), [])
+        remain = list(itertools.chain(*hsent.itervalues()))
         if multi:
-            remain = filter(lambda p: not hasattr(p, '_answered'), remain);
-            
+            remain = [p for p in remain if not hasattr(p, '_answered')]
+
         if autostop and len(remain) > 0 and len(remain) != len(tobesent):
             retry = autostop
             
diff --git a/scapy/volatile.py b/scapy/volatile.py
index 1a1f00024a80f8f14f1c423094113883f3bbe25f..a870b23c656fddd3ff87824cde832839100fcfe1 100644
--- a/scapy/volatile.py
+++ b/scapy/volatile.py
@@ -192,10 +192,8 @@ class RandEnumSLong(RandEnum):
 class RandEnumKeys(RandEnum):
     """Picks a random value from dict keys list. """
     def __init__(self, enum):
-        self.enum = []
-        for key in list(enum.keys()):
-            self.enum.append(key)
-        self.seq = RandomEnumeration(0, len(list(enum.keys())) - 1)
+        self.enum = list(enum)
+        self.seq = RandomEnumeration(0, len(self.enum) - 1)
 
     def _fix(self):
         return self.enum[self.seq.next()]
diff --git a/test/regression.uts b/test/regression.uts
index d86a5fb53ed4359ba3d32f899a4678c6943186ce..289235eda809121754ea83c8a6950ebd137ed929 100644
--- a/test/regression.uts
+++ b/test/regression.uts
@@ -4379,8 +4379,9 @@ builder = LargeTlvBuilder()
 builder.parse(plist)
 data = builder.get_data()
 assert len(data) == 1
-assert data.keys()[0].endswith(' [Detailed Icon Image]')
-assert data.values()[0] == 'abcdefg'
+key, value = data.popitem()
+assert key.endswith(' [Detailed Icon Image]')
+assert value == 'abcdefg'
 
 
 ############