2014-12-17 4 views
-1

У меня есть словарь, который содержит список расширенных имен классов в качестве ключей с каждым ключом, указывающим на список, содержащий количество раз, когда класс появляется в разных банках и какие банки появляются вХеш или dict классов в баночках, которые нуждаются в складывании

Например:.

classToJars = { 
 
    'com.sun.xml.ws.policy.PolicyMapKey.class' : [ 1, 'policy-2.3.1.jar'], 
 
    'com.sun.xml.ws.policy.PolicyMerger.class' : [ 1, 'policy-2.3.1.jar'], 
 
    'com.sun.xml.ws.policy.PolicyAssertion.class' : [ 1, 'policy-2.3.1.jar' ], 
 

 
    'com.sun.xml.bind.AccessorFactory.class'  : [1, 'jaxb-impl-2.2.6.jar'], 
 
    'com.sun.xml.bind.AccessorFactoryImpl.class' : [1, 'jaxb-impl-2.2.6.jar'], 
 
    'com.sun.xml.bind.AnyTypeAdapter.class'  : [1, 'jaxb-impl-2.2.6.jar' ], 
 

 
    'org.apache.mina.integration.jmx.IoSessionManager.class' :  [1, 'mina-integration-jmx-1.1.7.jar'], 
 
    'org.apache.mina.integration.jmx.IoServiceManager.class' :  [1, 'mina-integration-jmx-1.1.7.jar'], 
 

 
    'org.apache.log4j.Appender.class' : [2, 'log4j-1.2.14.jar', 'log4j-1.2.15.jar'], 
 
    'org.apache.log4j.AppenderSkeleton.class' : [2, 'log4j-1.2.14.jar', 'log4j-1.2.15.jar'], 
 
    
 
    'com.sun.activation.registries.LineTokenizer.class' : [1, 'activation-1.1.jar'], 
 
    'com.sun.activation.registries.LogSupport.class' : [1, 'activation-1.1.jar'], 
 

 
    'com.sun.istack.Builder.class' : [2, 'jaxb-impl-2.2.6.jar istack-commons-runtime-2.4.jar'], 
 
    'com.sun.istack.ByteArrayDataSource.class' : [2, 'jaxb-impl-2.2.6.jar istack-commons-runtime-2.4.jar'], 
 
    
 
    'com.reuters.rfa.ansipage.Page.class' : [1, 'rfa-7.2.0.E2.jar'], 
 
    'com.reuters.rfa.ansipage.PageUpdate.class' : [1, 'rfa-7.2.0.E2.jar'], 
 

 
    'org.apache.http.impl.io.AbstractMessageWriter.class' : [1, 'rfa-7.2.0.E2.jar'], 
 
    'org.apache.http.impl.io.ChunkedOutputStream.class' : [1, 'rfa-7.2.0.E2.jar'] 
 
}

большой ДИКТ с тысячами ключей и значений петельные над большим набором банок. Идея состоит в том, чтобы иметь возможность сбрасывать dict, если значения одинаковы, а затем складывать их до самой большой общей подстроки.

Например: при запуске функции складывания, указанное хэш должна быть уменьшена до 4-х строк следующим образом:

'com.sun.xml.ws.policy' \t \t \t : [ 1, 'policy-2.3.1.jar'], 
 
'com.sun.xml.bind'  \t \t \t : [1, 'jaxb-impl-2.2.6.jar'], 
 
'org.apache.mina.integration.jmx' \t : [1, 'mina-integration-jmx-1.1.7.jar'], 
 
'org.apache.log4j' \t \t \t \t \t : [2, 'log4j-1.2.14.jar', 'log4j-1.2.15.jar'], 
 
'com.sun.activation.registries' \t : [1, 'activation-1.1.jar'], 
 
'com.sun.istack' \t \t \t \t \t : [2, 'jaxb-impl-2.2.6.jar istack-commons-runtime-2.4.jar'], 
 
'com.reuters.rfa.ansipage' \t \t \t : [1, 'rfa-7.2.0.E2.jar'], 
 
'org.apache.http.impl.io' \t \t \t : [1, 'rfa-7.2.0.E2.jar'],

и так далее.

так как между com.reuters.rfa и org.apache.http нет ничего общего, он вернется с пустой клавишей, если вы зайдете на самую большую общую подстроку.

В таком случае необходимо просто вставить com.reuters.rfa и org.apache.http отдельно.

Любые идеи о том, как этого достичь?

+0

Действительно ли вы используете Python или это неправильный тег? – ThisSuitIsBlackNot

+0

@ThisSuitisBlackNot Честно говоря, я в порядке с perl или python, поскольку я просто ищу логику для решения этой проблемы. – soothsayer

+0

Пожалуйста, отформатируйте данные в действительном синтаксисе python. – ErikR

ответ

1

Это то, что вы хотите?

import os 

classToJars = { 
    'com.sun.xml.ws.policy.PolicyMapKey.class' : [ 1, 'policy-2.3.1.jar'], 
    'com.sun.xml.ws.policy.PolicyMerger.class' : [ 1, 'policy-2.3.1.jar'], 
    'com.sun.xml.ws.policy.PolicyAssertion.class' : [ 1, 'policy-2.3.1.jar' ], 

    'com.sun.xml.bind.AccessorFactory.class'  : [1, 'jaxb-impl-2.2.6.jar'], 
    'com.sun.xml.bind.AccessorFactoryImpl.class' : [1, 'jaxb-impl-2.2.6.jar'], 
    'com.sun.xml.bind.AnyTypeAdapter.class'  : [1, 'jaxb-impl-2.2.6.jar' ], 

    'org.apache.mina.integration.jmx.IoSessionManager.class' : 
     [1, 'mina-integration-jmx-1.1.7.jar'], 
    'org.apache.mina.integration.jmx.IoServiceManager.class' : 
     [1, 'mina-integration-jmx-1.1.7.jar'], 
    'org.apache.mina.integration.jmx.IoSessionManagerMBean.class' : 
     [1, 'mina-integration-jmx-1.1.7.jar' ], 

    'org.apache.log4j.Appender.class' : [2, 'log4j-1.2.14.jar', 'log4j-1.2.15.jar'], 
    'org.apache.log4j.AppenderSkeleton.class' : [2, 'log4j-1.2.14.jar', 'log4j-1.2.15.jar'], 
    'org.apache.log4j.AsyncAppender.class' : [2, 'log4j-1.2.14.jar log4j-1.2.15.jar'], 
    # ... 
    } 

# 
# from http://stackoverflow.com/a/21419164/866915 
# 
def common_prefix(names): 
    prefix = os.path.commonprefix([ n.split('.') for n in names ]) 
    return '.'.join(prefix) 

# return the first 3 components of a class name 
def min_prefix(name): 
    return '.'.join(name.split('.')[0:3]) 

jarsForKey = {} 
keyForClass = {} 

for c in classToJars: 
    jars = classToJars[c] 
    s = '|'.join(jars[1:]) 
    jarsForKey[s] = classToJars[c] 
    keyForClass[c] = s 

# group together classes based on their key 

sameKey = {} 
for c in classToJars: 
    s = keyForClass[c] 
    sameKey.setdefault(s,[]).append(c) 

# for each group of classes with the same key, find the largest common substring 

for s in sameKey: 
    cls = sameKey[s] # all of the classes with the same key 
    jars = jarsForKey[s] 

    # partition cls into groups having at least 3 components in common 

    group = {} 
    for c in cls: 
    m = min_prefix(c) 
    group.setdefault(m, []).append(c) 

    # find the common prefix for each group 

    for m in group: 
    cls = group[m] 
    prefix = common_prefix(cls) 
    print prefix, "==>", jars 
+0

Я так рад, что кто-то еще подумал об этой логике. Хотя я должен сказать, что есть проблемы с этим подходом. И я искренне извиняюсь, поскольку я должен был дать больше входных данных. Позвольте мне добавить больше ввода, и как только вы запустите программу, вы поймете лучше. – soothsayer

+0

Когда вы добавляете вышеуказанные записи в свой dict, так как нет ничего общего между com.reuters.rfa и org.apache.http, он вернется с пустым ключом – soothsayer

+0

Просто поместите его в свой оригинальный вопрос - это слишком сложно прочитайте в поле комментариев. – ErikR