Rearranging elements in Python












-1















i am new to Python and i cant get this.I have a List and i want to take the input from there and write those in files .



p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']


What i am trying :



with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
for i in p:
if len(i.partition("/")[0]) == 4:
fw1.write('int ' + i + 'n moden')
else:
i = 0
while i < len(p):
start = p[i].split('/')
if (start[0] == 'Eth101'):
i += 3

key = start[0]
i += 1
while i < len(p) and p[i].split('/')[0] == key:
i += 1
end = p[i-1].split('/')
fw2.write('confi ' + start[0] + '/' + start[1] + '-' + end[1] + 'n moden')


What i am looking for :



abc1.txt should have



int Eth1/1
mode
int Eth1/5
mode
int Eth2/1
mode
int Eth 2/4
mode


abc2.txt should have :



int Eth101/1/1-3
mode
int Eth102/1/1-3
mode
int Eth103/1/1-4
mode
int Eth104/1/1-4
mode




  1. So any Eth having 1 digit before " / " ( e:g Eth1/1 or Eth2/2
    )should be in one file that is abc1.txt .


  2. Any Eth having 3 digit before " / " ( e:g Eth101/1/1 or Eth 102/1/1
    ) should be in another file that is abc2.txt and .As these are in
    ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc





Any Idea ?










share|improve this question

























  • You only have one file open for writing in it. Have you tried opening two files in write mode?

    – colidyre
    Nov 21 '18 at 9:39











  • @colidyre i update my question

    – Nirmal Gauda
    Nov 21 '18 at 10:12











  • @colidyre hey i updated my question with what i am trying ..i am not getting the desired result..any idea how i need to do ?

    – Nirmal Gauda
    Nov 22 '18 at 6:13











  • @colidyre: i am getting error "invalid Syntax" for def get_network_ranges(networks: list:)

    – Nirmal Gauda
    Nov 22 '18 at 11:41











  • This comment is better placed at the answer. But nevertheless: You have an older python version which does not support type hints. Just remove the type hints to def get_network_ranges(networks): Ah, sorry have overseen your Python version. 2.6 :/

    – colidyre
    Nov 22 '18 at 11:44


















-1















i am new to Python and i cant get this.I have a List and i want to take the input from there and write those in files .



p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']


What i am trying :



with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
for i in p:
if len(i.partition("/")[0]) == 4:
fw1.write('int ' + i + 'n moden')
else:
i = 0
while i < len(p):
start = p[i].split('/')
if (start[0] == 'Eth101'):
i += 3

key = start[0]
i += 1
while i < len(p) and p[i].split('/')[0] == key:
i += 1
end = p[i-1].split('/')
fw2.write('confi ' + start[0] + '/' + start[1] + '-' + end[1] + 'n moden')


What i am looking for :



abc1.txt should have



int Eth1/1
mode
int Eth1/5
mode
int Eth2/1
mode
int Eth 2/4
mode


abc2.txt should have :



int Eth101/1/1-3
mode
int Eth102/1/1-3
mode
int Eth103/1/1-4
mode
int Eth104/1/1-4
mode




  1. So any Eth having 1 digit before " / " ( e:g Eth1/1 or Eth2/2
    )should be in one file that is abc1.txt .


  2. Any Eth having 3 digit before " / " ( e:g Eth101/1/1 or Eth 102/1/1
    ) should be in another file that is abc2.txt and .As these are in
    ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc





Any Idea ?










share|improve this question

























  • You only have one file open for writing in it. Have you tried opening two files in write mode?

    – colidyre
    Nov 21 '18 at 9:39











  • @colidyre i update my question

    – Nirmal Gauda
    Nov 21 '18 at 10:12











  • @colidyre hey i updated my question with what i am trying ..i am not getting the desired result..any idea how i need to do ?

    – Nirmal Gauda
    Nov 22 '18 at 6:13











  • @colidyre: i am getting error "invalid Syntax" for def get_network_ranges(networks: list:)

    – Nirmal Gauda
    Nov 22 '18 at 11:41











  • This comment is better placed at the answer. But nevertheless: You have an older python version which does not support type hints. Just remove the type hints to def get_network_ranges(networks): Ah, sorry have overseen your Python version. 2.6 :/

    – colidyre
    Nov 22 '18 at 11:44
















-1












-1








-1








i am new to Python and i cant get this.I have a List and i want to take the input from there and write those in files .



p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']


What i am trying :



with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
for i in p:
if len(i.partition("/")[0]) == 4:
fw1.write('int ' + i + 'n moden')
else:
i = 0
while i < len(p):
start = p[i].split('/')
if (start[0] == 'Eth101'):
i += 3

key = start[0]
i += 1
while i < len(p) and p[i].split('/')[0] == key:
i += 1
end = p[i-1].split('/')
fw2.write('confi ' + start[0] + '/' + start[1] + '-' + end[1] + 'n moden')


What i am looking for :



abc1.txt should have



int Eth1/1
mode
int Eth1/5
mode
int Eth2/1
mode
int Eth 2/4
mode


abc2.txt should have :



int Eth101/1/1-3
mode
int Eth102/1/1-3
mode
int Eth103/1/1-4
mode
int Eth104/1/1-4
mode




  1. So any Eth having 1 digit before " / " ( e:g Eth1/1 or Eth2/2
    )should be in one file that is abc1.txt .


  2. Any Eth having 3 digit before " / " ( e:g Eth101/1/1 or Eth 102/1/1
    ) should be in another file that is abc2.txt and .As these are in
    ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc





Any Idea ?










share|improve this question
















i am new to Python and i cant get this.I have a List and i want to take the input from there and write those in files .



p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']


What i am trying :



with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
for i in p:
if len(i.partition("/")[0]) == 4:
fw1.write('int ' + i + 'n moden')
else:
i = 0
while i < len(p):
start = p[i].split('/')
if (start[0] == 'Eth101'):
i += 3

key = start[0]
i += 1
while i < len(p) and p[i].split('/')[0] == key:
i += 1
end = p[i-1].split('/')
fw2.write('confi ' + start[0] + '/' + start[1] + '-' + end[1] + 'n moden')


What i am looking for :



abc1.txt should have



int Eth1/1
mode
int Eth1/5
mode
int Eth2/1
mode
int Eth 2/4
mode


abc2.txt should have :



int Eth101/1/1-3
mode
int Eth102/1/1-3
mode
int Eth103/1/1-4
mode
int Eth104/1/1-4
mode




  1. So any Eth having 1 digit before " / " ( e:g Eth1/1 or Eth2/2
    )should be in one file that is abc1.txt .


  2. Any Eth having 3 digit before " / " ( e:g Eth101/1/1 or Eth 102/1/1
    ) should be in another file that is abc2.txt and .As these are in
    ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc





Any Idea ?







list python-2.6






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 22 '18 at 4:52







Nirmal Gauda

















asked Nov 21 '18 at 9:35









Nirmal GaudaNirmal Gauda

246




246













  • You only have one file open for writing in it. Have you tried opening two files in write mode?

    – colidyre
    Nov 21 '18 at 9:39











  • @colidyre i update my question

    – Nirmal Gauda
    Nov 21 '18 at 10:12











  • @colidyre hey i updated my question with what i am trying ..i am not getting the desired result..any idea how i need to do ?

    – Nirmal Gauda
    Nov 22 '18 at 6:13











  • @colidyre: i am getting error "invalid Syntax" for def get_network_ranges(networks: list:)

    – Nirmal Gauda
    Nov 22 '18 at 11:41











  • This comment is better placed at the answer. But nevertheless: You have an older python version which does not support type hints. Just remove the type hints to def get_network_ranges(networks): Ah, sorry have overseen your Python version. 2.6 :/

    – colidyre
    Nov 22 '18 at 11:44





















  • You only have one file open for writing in it. Have you tried opening two files in write mode?

    – colidyre
    Nov 21 '18 at 9:39











  • @colidyre i update my question

    – Nirmal Gauda
    Nov 21 '18 at 10:12











  • @colidyre hey i updated my question with what i am trying ..i am not getting the desired result..any idea how i need to do ?

    – Nirmal Gauda
    Nov 22 '18 at 6:13











  • @colidyre: i am getting error "invalid Syntax" for def get_network_ranges(networks: list:)

    – Nirmal Gauda
    Nov 22 '18 at 11:41











  • This comment is better placed at the answer. But nevertheless: You have an older python version which does not support type hints. Just remove the type hints to def get_network_ranges(networks): Ah, sorry have overseen your Python version. 2.6 :/

    – colidyre
    Nov 22 '18 at 11:44



















You only have one file open for writing in it. Have you tried opening two files in write mode?

– colidyre
Nov 21 '18 at 9:39





You only have one file open for writing in it. Have you tried opening two files in write mode?

– colidyre
Nov 21 '18 at 9:39













@colidyre i update my question

– Nirmal Gauda
Nov 21 '18 at 10:12





@colidyre i update my question

– Nirmal Gauda
Nov 21 '18 at 10:12













@colidyre hey i updated my question with what i am trying ..i am not getting the desired result..any idea how i need to do ?

– Nirmal Gauda
Nov 22 '18 at 6:13





@colidyre hey i updated my question with what i am trying ..i am not getting the desired result..any idea how i need to do ?

– Nirmal Gauda
Nov 22 '18 at 6:13













@colidyre: i am getting error "invalid Syntax" for def get_network_ranges(networks: list:)

– Nirmal Gauda
Nov 22 '18 at 11:41





@colidyre: i am getting error "invalid Syntax" for def get_network_ranges(networks: list:)

– Nirmal Gauda
Nov 22 '18 at 11:41













This comment is better placed at the answer. But nevertheless: You have an older python version which does not support type hints. Just remove the type hints to def get_network_ranges(networks): Ah, sorry have overseen your Python version. 2.6 :/

– colidyre
Nov 22 '18 at 11:44







This comment is better placed at the answer. But nevertheless: You have an older python version which does not support type hints. Just remove the type hints to def get_network_ranges(networks): Ah, sorry have overseen your Python version. 2.6 :/

– colidyre
Nov 22 '18 at 11:44














1 Answer
1






active

oldest

votes


















0














I don't think you need a regex here, at all. All your items begin with 'Eth' followed by one or more digits. So you can check the length of the items before first / occurs and then write it to a file.



p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']

with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
for i in p:
if len(i.partition("/")[0]) == 4:
fw1.write('int ' + i + 'n moden')
else:
fw2.write('int ' + i + 'n moden')


I refactored your code a little to bring with-statement into play. This will handle correctly closing the file at the end. Also it is not necessary to iterate twice over the sequence, so it's all done in one iteration.



If the data is not as clean as provided, then you maybe want to use regexes. Independent of the regex itself, by writing if re.match(r'((Ethd{1}/d{1,2})', "p" ) you proof if a match object can be created for given regex on the string "p", not the value of the variable p. This is because you used " around p.



So this should work for your example. If you really need a regex, this will turn your problem in finding a good regex to match your needs without any other issues.




As these are in ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc




This is something you can achieve by first computing the string and then write it in the file. But this is more like a separate question.



UPDATE



It's not that trivial to compute the right network ranges. Here I can present you one approach which doesn't change my code but adds some functionality. The trick here is to get groups of connected networks which aren't interrupted by their numbers. For that I've copied consecutive_groups. You can also do a pip install more-itertools of course to get that functionality. And also I transformed the list to a dict to prepare the magic and then retransformed dict to list again. There are definitely better ways of doing it, but this worked for your input data, at least.



#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from itertools import groupby
from operator import itemgetter

p = ['Eth1/1', 'Eth1/5', 'Eth2/1', 'Eth2/4', 'Eth101/1/1', 'Eth101/1/2',
'Eth101/1/3', 'Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3', 'Eth103/1/1',
'Eth103/1/2', 'Eth103/1/3', 'Eth103/1/4', 'Eth104/1/1', 'Eth104/1/2',
'Eth104/1/3', 'Eth104/1/4']


def get_network_ranges(networks):
network_ranges = {}
result =

for network in networks:
parts = network.rpartition("/")
network_ranges.setdefault(parts[0], ).append(int(parts[2]))

for network, ranges in network_ranges.items():
ranges.sort()
for group in consecutive_groups(ranges):
group = list(group)
if len(group) == 1:
result.append(network + "/" + str(group[0]))
else:
result.append(network + "/" + str(group[0]) + "-" +
str(group[-1]))

result.sort() # to get ordered results
return result


def consecutive_groups(iterable, ordering=lambda x: x):
"""taken from more-itertools (latest)"""
for k, g in groupby(
enumerate(iterable), key=lambda x: x[0] - ordering(x[1])
):
yield map(itemgetter(1), g)


# only one line added to do the magic
with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
p = get_network_ranges(p)
for i in p:
if len(i.partition("/")[0]) == 4:
fw1.write('int ' + i + 'n moden')
else:
fw2.write('int ' + i + 'n moden')





share|improve this answer

























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53409039%2frearranging-elements-in-python%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    I don't think you need a regex here, at all. All your items begin with 'Eth' followed by one or more digits. So you can check the length of the items before first / occurs and then write it to a file.



    p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']

    with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
    for i in p:
    if len(i.partition("/")[0]) == 4:
    fw1.write('int ' + i + 'n moden')
    else:
    fw2.write('int ' + i + 'n moden')


    I refactored your code a little to bring with-statement into play. This will handle correctly closing the file at the end. Also it is not necessary to iterate twice over the sequence, so it's all done in one iteration.



    If the data is not as clean as provided, then you maybe want to use regexes. Independent of the regex itself, by writing if re.match(r'((Ethd{1}/d{1,2})', "p" ) you proof if a match object can be created for given regex on the string "p", not the value of the variable p. This is because you used " around p.



    So this should work for your example. If you really need a regex, this will turn your problem in finding a good regex to match your needs without any other issues.




    As these are in ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc




    This is something you can achieve by first computing the string and then write it in the file. But this is more like a separate question.



    UPDATE



    It's not that trivial to compute the right network ranges. Here I can present you one approach which doesn't change my code but adds some functionality. The trick here is to get groups of connected networks which aren't interrupted by their numbers. For that I've copied consecutive_groups. You can also do a pip install more-itertools of course to get that functionality. And also I transformed the list to a dict to prepare the magic and then retransformed dict to list again. There are definitely better ways of doing it, but this worked for your input data, at least.



    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    from itertools import groupby
    from operator import itemgetter

    p = ['Eth1/1', 'Eth1/5', 'Eth2/1', 'Eth2/4', 'Eth101/1/1', 'Eth101/1/2',
    'Eth101/1/3', 'Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3', 'Eth103/1/1',
    'Eth103/1/2', 'Eth103/1/3', 'Eth103/1/4', 'Eth104/1/1', 'Eth104/1/2',
    'Eth104/1/3', 'Eth104/1/4']


    def get_network_ranges(networks):
    network_ranges = {}
    result =

    for network in networks:
    parts = network.rpartition("/")
    network_ranges.setdefault(parts[0], ).append(int(parts[2]))

    for network, ranges in network_ranges.items():
    ranges.sort()
    for group in consecutive_groups(ranges):
    group = list(group)
    if len(group) == 1:
    result.append(network + "/" + str(group[0]))
    else:
    result.append(network + "/" + str(group[0]) + "-" +
    str(group[-1]))

    result.sort() # to get ordered results
    return result


    def consecutive_groups(iterable, ordering=lambda x: x):
    """taken from more-itertools (latest)"""
    for k, g in groupby(
    enumerate(iterable), key=lambda x: x[0] - ordering(x[1])
    ):
    yield map(itemgetter(1), g)


    # only one line added to do the magic
    with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
    p = get_network_ranges(p)
    for i in p:
    if len(i.partition("/")[0]) == 4:
    fw1.write('int ' + i + 'n moden')
    else:
    fw2.write('int ' + i + 'n moden')





    share|improve this answer






























      0














      I don't think you need a regex here, at all. All your items begin with 'Eth' followed by one or more digits. So you can check the length of the items before first / occurs and then write it to a file.



      p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']

      with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
      for i in p:
      if len(i.partition("/")[0]) == 4:
      fw1.write('int ' + i + 'n moden')
      else:
      fw2.write('int ' + i + 'n moden')


      I refactored your code a little to bring with-statement into play. This will handle correctly closing the file at the end. Also it is not necessary to iterate twice over the sequence, so it's all done in one iteration.



      If the data is not as clean as provided, then you maybe want to use regexes. Independent of the regex itself, by writing if re.match(r'((Ethd{1}/d{1,2})', "p" ) you proof if a match object can be created for given regex on the string "p", not the value of the variable p. This is because you used " around p.



      So this should work for your example. If you really need a regex, this will turn your problem in finding a good regex to match your needs without any other issues.




      As these are in ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc




      This is something you can achieve by first computing the string and then write it in the file. But this is more like a separate question.



      UPDATE



      It's not that trivial to compute the right network ranges. Here I can present you one approach which doesn't change my code but adds some functionality. The trick here is to get groups of connected networks which aren't interrupted by their numbers. For that I've copied consecutive_groups. You can also do a pip install more-itertools of course to get that functionality. And also I transformed the list to a dict to prepare the magic and then retransformed dict to list again. There are definitely better ways of doing it, but this worked for your input data, at least.



      #!/usr/bin/env python3
      # -*- coding: utf-8 -*-

      from itertools import groupby
      from operator import itemgetter

      p = ['Eth1/1', 'Eth1/5', 'Eth2/1', 'Eth2/4', 'Eth101/1/1', 'Eth101/1/2',
      'Eth101/1/3', 'Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3', 'Eth103/1/1',
      'Eth103/1/2', 'Eth103/1/3', 'Eth103/1/4', 'Eth104/1/1', 'Eth104/1/2',
      'Eth104/1/3', 'Eth104/1/4']


      def get_network_ranges(networks):
      network_ranges = {}
      result =

      for network in networks:
      parts = network.rpartition("/")
      network_ranges.setdefault(parts[0], ).append(int(parts[2]))

      for network, ranges in network_ranges.items():
      ranges.sort()
      for group in consecutive_groups(ranges):
      group = list(group)
      if len(group) == 1:
      result.append(network + "/" + str(group[0]))
      else:
      result.append(network + "/" + str(group[0]) + "-" +
      str(group[-1]))

      result.sort() # to get ordered results
      return result


      def consecutive_groups(iterable, ordering=lambda x: x):
      """taken from more-itertools (latest)"""
      for k, g in groupby(
      enumerate(iterable), key=lambda x: x[0] - ordering(x[1])
      ):
      yield map(itemgetter(1), g)


      # only one line added to do the magic
      with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
      p = get_network_ranges(p)
      for i in p:
      if len(i.partition("/")[0]) == 4:
      fw1.write('int ' + i + 'n moden')
      else:
      fw2.write('int ' + i + 'n moden')





      share|improve this answer




























        0












        0








        0







        I don't think you need a regex here, at all. All your items begin with 'Eth' followed by one or more digits. So you can check the length of the items before first / occurs and then write it to a file.



        p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']

        with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
        for i in p:
        if len(i.partition("/")[0]) == 4:
        fw1.write('int ' + i + 'n moden')
        else:
        fw2.write('int ' + i + 'n moden')


        I refactored your code a little to bring with-statement into play. This will handle correctly closing the file at the end. Also it is not necessary to iterate twice over the sequence, so it's all done in one iteration.



        If the data is not as clean as provided, then you maybe want to use regexes. Independent of the regex itself, by writing if re.match(r'((Ethd{1}/d{1,2})', "p" ) you proof if a match object can be created for given regex on the string "p", not the value of the variable p. This is because you used " around p.



        So this should work for your example. If you really need a regex, this will turn your problem in finding a good regex to match your needs without any other issues.




        As these are in ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc




        This is something you can achieve by first computing the string and then write it in the file. But this is more like a separate question.



        UPDATE



        It's not that trivial to compute the right network ranges. Here I can present you one approach which doesn't change my code but adds some functionality. The trick here is to get groups of connected networks which aren't interrupted by their numbers. For that I've copied consecutive_groups. You can also do a pip install more-itertools of course to get that functionality. And also I transformed the list to a dict to prepare the magic and then retransformed dict to list again. There are definitely better ways of doing it, but this worked for your input data, at least.



        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-

        from itertools import groupby
        from operator import itemgetter

        p = ['Eth1/1', 'Eth1/5', 'Eth2/1', 'Eth2/4', 'Eth101/1/1', 'Eth101/1/2',
        'Eth101/1/3', 'Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3', 'Eth103/1/1',
        'Eth103/1/2', 'Eth103/1/3', 'Eth103/1/4', 'Eth104/1/1', 'Eth104/1/2',
        'Eth104/1/3', 'Eth104/1/4']


        def get_network_ranges(networks):
        network_ranges = {}
        result =

        for network in networks:
        parts = network.rpartition("/")
        network_ranges.setdefault(parts[0], ).append(int(parts[2]))

        for network, ranges in network_ranges.items():
        ranges.sort()
        for group in consecutive_groups(ranges):
        group = list(group)
        if len(group) == 1:
        result.append(network + "/" + str(group[0]))
        else:
        result.append(network + "/" + str(group[0]) + "-" +
        str(group[-1]))

        result.sort() # to get ordered results
        return result


        def consecutive_groups(iterable, ordering=lambda x: x):
        """taken from more-itertools (latest)"""
        for k, g in groupby(
        enumerate(iterable), key=lambda x: x[0] - ordering(x[1])
        ):
        yield map(itemgetter(1), g)


        # only one line added to do the magic
        with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
        p = get_network_ranges(p)
        for i in p:
        if len(i.partition("/")[0]) == 4:
        fw1.write('int ' + i + 'n moden')
        else:
        fw2.write('int ' + i + 'n moden')





        share|improve this answer















        I don't think you need a regex here, at all. All your items begin with 'Eth' followed by one or more digits. So you can check the length of the items before first / occurs and then write it to a file.



        p = ['Eth1/1', 'Eth1/5','Eth2/1', 'Eth2/4','Eth101/1/1', 'Eth101/1/2', 'Eth101/1/3','Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3','Eth103/1/1', 'Eth103/1/2', 'Eth103/1/3','Eth103/1/4','Eth104/1/1', 'Eth104/1/2', 'Eth104/1/3','Eth104/1/4']

        with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
        for i in p:
        if len(i.partition("/")[0]) == 4:
        fw1.write('int ' + i + 'n moden')
        else:
        fw2.write('int ' + i + 'n moden')


        I refactored your code a little to bring with-statement into play. This will handle correctly closing the file at the end. Also it is not necessary to iterate twice over the sequence, so it's all done in one iteration.



        If the data is not as clean as provided, then you maybe want to use regexes. Independent of the regex itself, by writing if re.match(r'((Ethd{1}/d{1,2})', "p" ) you proof if a match object can be created for given regex on the string "p", not the value of the variable p. This is because you used " around p.



        So this should work for your example. If you really need a regex, this will turn your problem in finding a good regex to match your needs without any other issues.




        As these are in ranges , need to write it like Eth101/1/1-3, Eth102/1/1-3 etc




        This is something you can achieve by first computing the string and then write it in the file. But this is more like a separate question.



        UPDATE



        It's not that trivial to compute the right network ranges. Here I can present you one approach which doesn't change my code but adds some functionality. The trick here is to get groups of connected networks which aren't interrupted by their numbers. For that I've copied consecutive_groups. You can also do a pip install more-itertools of course to get that functionality. And also I transformed the list to a dict to prepare the magic and then retransformed dict to list again. There are definitely better ways of doing it, but this worked for your input data, at least.



        #!/usr/bin/env python3
        # -*- coding: utf-8 -*-

        from itertools import groupby
        from operator import itemgetter

        p = ['Eth1/1', 'Eth1/5', 'Eth2/1', 'Eth2/4', 'Eth101/1/1', 'Eth101/1/2',
        'Eth101/1/3', 'Eth102/1/1', 'Eth102/1/2', 'Eth102/1/3', 'Eth103/1/1',
        'Eth103/1/2', 'Eth103/1/3', 'Eth103/1/4', 'Eth104/1/1', 'Eth104/1/2',
        'Eth104/1/3', 'Eth104/1/4']


        def get_network_ranges(networks):
        network_ranges = {}
        result =

        for network in networks:
        parts = network.rpartition("/")
        network_ranges.setdefault(parts[0], ).append(int(parts[2]))

        for network, ranges in network_ranges.items():
        ranges.sort()
        for group in consecutive_groups(ranges):
        group = list(group)
        if len(group) == 1:
        result.append(network + "/" + str(group[0]))
        else:
        result.append(network + "/" + str(group[0]) + "-" +
        str(group[-1]))

        result.sort() # to get ordered results
        return result


        def consecutive_groups(iterable, ordering=lambda x: x):
        """taken from more-itertools (latest)"""
        for k, g in groupby(
        enumerate(iterable), key=lambda x: x[0] - ordering(x[1])
        ):
        yield map(itemgetter(1), g)


        # only one line added to do the magic
        with open("abc1.txt", "w+") as fw1, open("abc2.txt", "w+") as fw2:
        p = get_network_ranges(p)
        for i in p:
        if len(i.partition("/")[0]) == 4:
        fw1.write('int ' + i + 'n moden')
        else:
        fw2.write('int ' + i + 'n moden')






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 23 '18 at 12:58

























        answered Nov 21 '18 at 11:01









        colidyrecolidyre

        1,61941428




        1,61941428






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53409039%2frearranging-elements-in-python%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Berounka

            Sphinx de Gizeh

            Fiat S.p.A.