Well... not quite. (For one thing, you’re continually referencing the first/zero-th object in the list, which is a mistake a lot of people make.)
The shape of the new AVM object isn’t really clear, but it now sounds like you’re trying to intersect 2 different lists based on the equality of a specific property. Originally, it seemed like you were trying to intersect a list (the Opportunities) with a single object (the Lead).
Here’s one way to do a list intersection:
#set( $mergedOpptyAndAVMList = [] )
#foreach( $oppty in $OpportunityList )
#foreach( $avm in $AVM_Values__cList )
#if( $oppty.Zipcode__c.equals($avm.Zip_Code__c) )
#set( $void = $oppty.putAll($avm) )
#set( $void = $mergedOpptyAndAVMList.add($oppty) )
#end
#end
#end
This will leave you with the list $mergedOpptyAndAVMList — a new list where each member is an Opportunity object + AVM object merged into a single meta-object. The objects are “joined” on their respective zip code properties.