It's a bit pity, that the set does not preserve the order. But if the order is not relevant, the set solution is the best. One problem is there, you're creating over and over an intersection with two sets in your list comprehension.
dict1 = {'red': 3,'blue': 4,'yellow': 6}
dict2 = {'red': 'is a color', 'blue': 'is another color'}
# the method keys() return a set like object,
# but the order is kept until a set operation is applied
# then the order is lost.
same_keys = dict1.keys() & dict2.keys()
# the & operator is the intersection of two sets:
# https://docs.python.org/3/library/stdtypes.html?intersection=set#frozenset.intersection
# intersection(*others)
# set & other & ...
# Return a new set with elements common to the set and all others.
same_keys_preserved_order = [key for key in dict1.keys() if key in dict2]
# key order from same_keys_preserved_order
# putting value1 and value2 into a tuple
values_dict1_dict2 = [(dict1[key], dict2[key]) for key in same_keys_preserved_order]
# dict.items() return an iterator, which preserve the order
# same with dict.keys(), dict.values()
values1 = [value for key, value in dict1.items() if key in same_keys]
values2 = [value for key, value in dict2.items() if key in same_keys]
# same with a for-block
values1 = []
for key, value in dict1.items():
if key in same_keys:
values1.append(value)
You need to know which values from which dict you need.