मैं अजगर का उपयोग कर रहा हूं और मैं एक कोड लिखना चाहता हूं, जो केवल दो पहले कॉलम (0:1) की तुलना करेगा और यदि दूसरी फ़ाइल में कॉलम 0 और 1 में समान मान हैं, तो लाइन को मर्ज किया जाना चाहिए और एक में लिखा जाना चाहिए नई फ़ाइल।

उदाहरण के लिए: यहां छवि विवरण दर्ज करें

या व्यक्तियों के साथ उदाहरण:

यहां छवि विवरण दर्ज करें मेरे पास अब जो कोड है वह यह है, लेकिन यह अच्छा नहीं है

f1 = open('f1.txt','r')
f2 = open('f2.txt','r')
f3 = open('f12.txt','w')


f1_readlines = f1.readlines()
f1_linenum = len(f1_readlines)


f2_readlines = f2.readlines()
f2_linenum = len(f2_readlines)

i=0
while(i<f1_linenum):
    j=0
    while(j<f2_linenum):
        if(f1_readlines[0:1] == f2_readlines[0:1]):
            print(f1_readlines[i])
            f12.write(f1_readlines[i])
        j = j + 1
    i = i + 1

f1.close()
f2.close()
f12.close()
1
November 31 मार्च 2018, 14:27

2 जवाब

सबसे बढ़िया उत्तर

यहाँ एक एल्गोरिथ्म है जो आप दो अवर्गीकृत फ़ाइलों के साथ करना चाहते हैं। इस एल्गोरिथम को स्मृति में केवल एक फ़ाइल की आवश्यकता का लाभ है और इसमें एक समय जटिलता है जो इनपुट फ़ाइलों की लंबाई के योग में रैखिक है। दूसरे शब्दों में, यह एल्गोरिथम कम मात्रा में मेमोरी और समय का उपयोग करता है - कई अन्य एल्गोरिदम अधिक स्थान या समय लेंगे। (@dede द्वारा उत्तर अच्छी तरह से काम करता प्रतीत होता है और मेरी तुलना में सरल है लेकिन यह अधिक मेमोरी और अधिक समय दोनों का उपयोग करता है, जो बड़ी इनपुट फ़ाइलों के लिए बहुत ध्यान देने योग्य होगा।)

सबसे पहले, पहली फ़ाइल को पढ़ें, पंक्ति दर पंक्ति, और उससे एक शब्दकोश बनाएँ। प्रत्येक कुंजी एक पंक्ति में पहले दो आइटमों का एक टपल है, और संबंधित मान शेष पंक्ति है। आपके दूसरे उदाहरण में परिणामी शब्दकोश होगा

{('Brad', 'Pitt'): 'cherries', ('Angelina', 'Jolie'): 'bred', ('Jack', 'Nicholson'): 'apples', ('Nicole', 'Kidman'): 'cucumber'}

फिर आप एक खाली आउटपुट फ़ाइल बनाते हैं और दूसरी इनपुट फ़ाइल लाइन को लाइन से पढ़ते हैं। प्रत्येक पंक्ति के लिए, आप देखते हैं कि पहले दो आइटम शब्दकोश में हैं या नहीं। यदि ऐसा है, तो अपनी इच्छित लाइन को आउटपुट फ़ाइल में प्रिंट करें। यदि नहीं, तो उस पंक्ति के साथ कुछ न करें।

तब आपकी स्मृति का मुख्य उपयोग शब्दकोश है। आप प्रत्येक इनपुट फ़ाइल को केवल एक बार और लाइन से लाइन में गए, इसलिए यह तेज़ है। इस दृष्टिकोण की मुख्य संभावित कमजोरी यह है कि आउटपुट फ़ाइल इस क्रम में होगी कि आइटम दूसरी इनपुट फ़ाइल में थे, जो आपके दूसरे उदाहरण में क्रम है। यदि आप इसके बजाय पहली इनपुट फ़ाइल का क्रम चाहते हैं, तो बस दो इनपुट फ़ाइलों के उपयोग को स्वैप करें।

यहाँ उस एल्गोरिथ्म से मेरा कोड है। यह संस्करण मानता है कि प्रत्येक इनपुट लाइन में रिक्त स्थान या टैब द्वारा अलग किए गए तीन आइटम हैं। यदि किसी पंक्ति में "तीसरे आइटम" में एक स्थान या एक टैब शामिल हो सकता है, तो कोड को थोड़ा जटिल करने की आवश्यकता होगी। अपनी उदाहरण इनपुट फ़ाइलों का उपयोग करके, इस कोड के परिणाम वही हैं जो आप चाहते थे।

def similar_columns(filenameinput1, filenameinput2, filename_output):
    """Find the similar columns in two files.
    This assumes each line has exactly three items.
    """
    # Build a dictionary of the items in the first input file
    items_dict = {}
    with open(filenameinput1, 'r') as inputfile1:
        for line in inputfile1:
            col0, col1, oldcolrest = line.split()
            items_dict[(col0, col1)] = oldcolrest

    # Compare the items in the second input file, saving matches
    with open(filenameinput2, 'r') as inputfile2,  \
         open(filename_output, 'w') as outputfile:
        for line in inputfile2:
            col0, col1, newcolrest = line.split()
            oldcolrest = items_dict.get((col0, col1), None)
            if oldcolrest is not None:
                outputfile.write('{} {} {} {}\n'.format(
                        col0, col1, oldcolrest, newcolrest))

similar_columns('f1.txt', 'f2.txt', 'f12.txt')
similar_columns('shop1.txt', 'shop2.txt', 'total.txt')
1
Rory Daulton 31 मार्च 2018, 15:05

मैंने इसे भोले तरीके से हल करने की कोशिश की है

f1 = open('f1.txt','r')
f2 = open('f2.txt','r')
f3 = open('fusion.txt','w')

# read f1 lines from file
f1_readlines = f1.readlines()
# get f1 length
f1_linenum = len(f1_readlines)

# read f2 lines from file
f2_readlines = f2.readlines()
# get f2 length
f2_linenum = len(f2_readlines)

for f1_line in f1_readlines:
    arr1 = f1_line.split(" ")
    c11 = arr1[0]
    c12 = arr1[1]

    for f2_line in f2_readlines:
        arr2 = f2_line.split(" ")
        c21 = arr2[0]
        c22 = arr2[1]
        if((c11 == c21) & (c12 == c22)):
            output = [c11,c12]

            for c in arr1[2:]:
                s = c.strip("\n")
                output.append(s)

            for c in arr2[2:]:
                s = c.strip("\n")
                output.append(s)

            for num in output[0:len(output)-1]:
                f3.write(num)
                f3.write(" ")
            f3.write(output[len(output)-1])
            f3.write("\n")

f1.close()
f2.close()
f3.close()

F1

10 10 25
20 20 20 
11 11 11 
23 23 23 
56 66 55 
78 56 56 7 
77 77 77 

F2

10 10 55
77 77 77
20 22 20
11 13 11
2 23 23
56 66 55 99
78 56 56  

विलय

10 10 25 55
56 66 55 55 99
78 56 56 7 56
77 77 77 77

आशा है कि यह इसे हल कर सकता है :)

1
jklasdjkl 31 मार्च 2018, 15:19