Lower elements in list given a certain position












0















I must lower letters in a list if the occupy a certain position given in a previous function I did. The function I must program is lower_words.



I'm having an issue: every time I lower an element the row is repeated.



I don't need to use the list "words" for this. Just left it there so you could understand better what the function does/must do. Can someone help me?



words= ["PATO", "GATO", "BOI", "CAO"]

grid1= ["PIGATOS",
"ANRBKFD",
"TMCAOXA",
"OOBBYQU",
"MACOUIV",
"EEJMIWL"]

positions_words_occupy = ((0, 0), (1, 0), (2, 0), (3, 0), (0, 2), (0, 3), (0, 4), (0, 5), (3, 2), (4, 3), (5, 4), (2, 2), (2, 3), (2, 4)) #these are the positions the words occupy. I have determined these positions with a previous function. first is the line, second the column


def lower_words(grid, positions_words_occupy):

new=

for position in positions_words_occupy:

line= position[0]
column= position[1]

row= grid[line]
element= row[column]

new.append(row.replace(element, element.lower()))

return new


Expected output:



['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']


Actual output:



['pIGATOS', 'aNRBKFD', 'tMCAOXA', 'ooBBYQU', 'PIgATOS', 'PIGaTOS', 'PIGAtOS', 'PIGAToS', 'OObbYQU', 'MACoUIV', 'EEJMiWL', 'TMcAOXA', 'TMCaOXa', 'TMCAoXA']


Changing the perspective, you can see it lowers the words I have in the list words:



 ['pIgatoS', 
'aNRBKFD',
'tMcaoXA',
'oObBYQU',
'MACoUIV',
'EEJMiWL']









share|improve this question

























  • It is unclear what's the logic of this...

    – U9-Forward
    Jan 19 at 23:55
















0















I must lower letters in a list if the occupy a certain position given in a previous function I did. The function I must program is lower_words.



I'm having an issue: every time I lower an element the row is repeated.



I don't need to use the list "words" for this. Just left it there so you could understand better what the function does/must do. Can someone help me?



words= ["PATO", "GATO", "BOI", "CAO"]

grid1= ["PIGATOS",
"ANRBKFD",
"TMCAOXA",
"OOBBYQU",
"MACOUIV",
"EEJMIWL"]

positions_words_occupy = ((0, 0), (1, 0), (2, 0), (3, 0), (0, 2), (0, 3), (0, 4), (0, 5), (3, 2), (4, 3), (5, 4), (2, 2), (2, 3), (2, 4)) #these are the positions the words occupy. I have determined these positions with a previous function. first is the line, second the column


def lower_words(grid, positions_words_occupy):

new=

for position in positions_words_occupy:

line= position[0]
column= position[1]

row= grid[line]
element= row[column]

new.append(row.replace(element, element.lower()))

return new


Expected output:



['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']


Actual output:



['pIGATOS', 'aNRBKFD', 'tMCAOXA', 'ooBBYQU', 'PIgATOS', 'PIGaTOS', 'PIGAtOS', 'PIGAToS', 'OObbYQU', 'MACoUIV', 'EEJMiWL', 'TMcAOXA', 'TMCaOXa', 'TMCAoXA']


Changing the perspective, you can see it lowers the words I have in the list words:



 ['pIgatoS', 
'aNRBKFD',
'tMcaoXA',
'oObBYQU',
'MACoUIV',
'EEJMiWL']









share|improve this question

























  • It is unclear what's the logic of this...

    – U9-Forward
    Jan 19 at 23:55














0












0








0








I must lower letters in a list if the occupy a certain position given in a previous function I did. The function I must program is lower_words.



I'm having an issue: every time I lower an element the row is repeated.



I don't need to use the list "words" for this. Just left it there so you could understand better what the function does/must do. Can someone help me?



words= ["PATO", "GATO", "BOI", "CAO"]

grid1= ["PIGATOS",
"ANRBKFD",
"TMCAOXA",
"OOBBYQU",
"MACOUIV",
"EEJMIWL"]

positions_words_occupy = ((0, 0), (1, 0), (2, 0), (3, 0), (0, 2), (0, 3), (0, 4), (0, 5), (3, 2), (4, 3), (5, 4), (2, 2), (2, 3), (2, 4)) #these are the positions the words occupy. I have determined these positions with a previous function. first is the line, second the column


def lower_words(grid, positions_words_occupy):

new=

for position in positions_words_occupy:

line= position[0]
column= position[1]

row= grid[line]
element= row[column]

new.append(row.replace(element, element.lower()))

return new


Expected output:



['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']


Actual output:



['pIGATOS', 'aNRBKFD', 'tMCAOXA', 'ooBBYQU', 'PIgATOS', 'PIGaTOS', 'PIGAtOS', 'PIGAToS', 'OObbYQU', 'MACoUIV', 'EEJMiWL', 'TMcAOXA', 'TMCaOXa', 'TMCAoXA']


Changing the perspective, you can see it lowers the words I have in the list words:



 ['pIgatoS', 
'aNRBKFD',
'tMcaoXA',
'oObBYQU',
'MACoUIV',
'EEJMiWL']









share|improve this question
















I must lower letters in a list if the occupy a certain position given in a previous function I did. The function I must program is lower_words.



I'm having an issue: every time I lower an element the row is repeated.



I don't need to use the list "words" for this. Just left it there so you could understand better what the function does/must do. Can someone help me?



words= ["PATO", "GATO", "BOI", "CAO"]

grid1= ["PIGATOS",
"ANRBKFD",
"TMCAOXA",
"OOBBYQU",
"MACOUIV",
"EEJMIWL"]

positions_words_occupy = ((0, 0), (1, 0), (2, 0), (3, 0), (0, 2), (0, 3), (0, 4), (0, 5), (3, 2), (4, 3), (5, 4), (2, 2), (2, 3), (2, 4)) #these are the positions the words occupy. I have determined these positions with a previous function. first is the line, second the column


def lower_words(grid, positions_words_occupy):

new=

for position in positions_words_occupy:

line= position[0]
column= position[1]

row= grid[line]
element= row[column]

new.append(row.replace(element, element.lower()))

return new


Expected output:



['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']


Actual output:



['pIGATOS', 'aNRBKFD', 'tMCAOXA', 'ooBBYQU', 'PIgATOS', 'PIGaTOS', 'PIGAtOS', 'PIGAToS', 'OObbYQU', 'MACoUIV', 'EEJMiWL', 'TMcAOXA', 'TMCaOXa', 'TMCAoXA']


Changing the perspective, you can see it lowers the words I have in the list words:



 ['pIgatoS', 
'aNRBKFD',
'tMcaoXA',
'oObBYQU',
'MACoUIV',
'EEJMiWL']






python






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 20 at 0:08









John Kugelman

242k53404457




242k53404457










asked Jan 19 at 23:45









Kelly BaptistaKelly Baptista

104




104













  • It is unclear what's the logic of this...

    – U9-Forward
    Jan 19 at 23:55



















  • It is unclear what's the logic of this...

    – U9-Forward
    Jan 19 at 23:55

















It is unclear what's the logic of this...

– U9-Forward
Jan 19 at 23:55





It is unclear what's the logic of this...

– U9-Forward
Jan 19 at 23:55












2 Answers
2






active

oldest

votes


















0














You are very close! You're actually appending to your new list new every time you replace a letter. That is why you are getting so many values in your list.



Another way you would run your code is to create a copy of grid1, and then replace each word every time you replace a letter. Here is a new function implementing these small changes:



def lower_words(grid, positions_words_occupy):

new = grid1.copy()

for position in positions_words_occupy:

line= position[0]
column= position[1]

row= new[line]
element= row[column]

#new.remove(row)
new_word = row[:column] + element.lower() + row[column+1:]
new[line] = new_word

return new


Output running lower_words(grid1, positions_words_occupy):



['pIgatoS', 'aNRBKFD', 'tMcaoXa', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





share|improve this answer


























  • 'oobbYQU' must be 'oObBYQU' :o

    – Kelly Baptista
    Jan 20 at 0:15











  • I have corrected the code to output correctly.

    – Joe Patten
    Jan 20 at 0:54











  • Worked! Thank you so much :)

    – Kelly Baptista
    Jan 20 at 1:05



















0














I would first collect your grid positions in a collections.defaultdict or sets, then rebuild the strings with lowercase letters if their positions exist in these sets.



Demo:



from collections import defaultdict

grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]

positions_words_occupy = (
(0, 0),
(1, 0),
(2, 0),
(3, 0),
(0, 2),
(0, 3),
(0, 4),
(0, 5),
(3, 2),
(4, 3),
(5, 4),
(2, 2),
(2, 3),
(2, 4),
)

d = defaultdict(set)
for grid, pos in positions_words_occupy:
d[grid].add(pos)

result =
for grid, pos in d.items():
result.append(
"".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
)

print(result)


Output:



['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





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%2f54272334%2flower-elements-in-list-given-a-certain-position%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You are very close! You're actually appending to your new list new every time you replace a letter. That is why you are getting so many values in your list.



    Another way you would run your code is to create a copy of grid1, and then replace each word every time you replace a letter. Here is a new function implementing these small changes:



    def lower_words(grid, positions_words_occupy):

    new = grid1.copy()

    for position in positions_words_occupy:

    line= position[0]
    column= position[1]

    row= new[line]
    element= row[column]

    #new.remove(row)
    new_word = row[:column] + element.lower() + row[column+1:]
    new[line] = new_word

    return new


    Output running lower_words(grid1, positions_words_occupy):



    ['pIgatoS', 'aNRBKFD', 'tMcaoXa', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





    share|improve this answer


























    • 'oobbYQU' must be 'oObBYQU' :o

      – Kelly Baptista
      Jan 20 at 0:15











    • I have corrected the code to output correctly.

      – Joe Patten
      Jan 20 at 0:54











    • Worked! Thank you so much :)

      – Kelly Baptista
      Jan 20 at 1:05
















    0














    You are very close! You're actually appending to your new list new every time you replace a letter. That is why you are getting so many values in your list.



    Another way you would run your code is to create a copy of grid1, and then replace each word every time you replace a letter. Here is a new function implementing these small changes:



    def lower_words(grid, positions_words_occupy):

    new = grid1.copy()

    for position in positions_words_occupy:

    line= position[0]
    column= position[1]

    row= new[line]
    element= row[column]

    #new.remove(row)
    new_word = row[:column] + element.lower() + row[column+1:]
    new[line] = new_word

    return new


    Output running lower_words(grid1, positions_words_occupy):



    ['pIgatoS', 'aNRBKFD', 'tMcaoXa', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





    share|improve this answer


























    • 'oobbYQU' must be 'oObBYQU' :o

      – Kelly Baptista
      Jan 20 at 0:15











    • I have corrected the code to output correctly.

      – Joe Patten
      Jan 20 at 0:54











    • Worked! Thank you so much :)

      – Kelly Baptista
      Jan 20 at 1:05














    0












    0








    0







    You are very close! You're actually appending to your new list new every time you replace a letter. That is why you are getting so many values in your list.



    Another way you would run your code is to create a copy of grid1, and then replace each word every time you replace a letter. Here is a new function implementing these small changes:



    def lower_words(grid, positions_words_occupy):

    new = grid1.copy()

    for position in positions_words_occupy:

    line= position[0]
    column= position[1]

    row= new[line]
    element= row[column]

    #new.remove(row)
    new_word = row[:column] + element.lower() + row[column+1:]
    new[line] = new_word

    return new


    Output running lower_words(grid1, positions_words_occupy):



    ['pIgatoS', 'aNRBKFD', 'tMcaoXa', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





    share|improve this answer















    You are very close! You're actually appending to your new list new every time you replace a letter. That is why you are getting so many values in your list.



    Another way you would run your code is to create a copy of grid1, and then replace each word every time you replace a letter. Here is a new function implementing these small changes:



    def lower_words(grid, positions_words_occupy):

    new = grid1.copy()

    for position in positions_words_occupy:

    line= position[0]
    column= position[1]

    row= new[line]
    element= row[column]

    #new.remove(row)
    new_word = row[:column] + element.lower() + row[column+1:]
    new[line] = new_word

    return new


    Output running lower_words(grid1, positions_words_occupy):



    ['pIgatoS', 'aNRBKFD', 'tMcaoXa', 'oObBYQU', 'MACoUIV', 'EEJMiWL']






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Jan 20 at 0:53

























    answered Jan 20 at 0:05









    Joe PattenJoe Patten

    1,3801414




    1,3801414













    • 'oobbYQU' must be 'oObBYQU' :o

      – Kelly Baptista
      Jan 20 at 0:15











    • I have corrected the code to output correctly.

      – Joe Patten
      Jan 20 at 0:54











    • Worked! Thank you so much :)

      – Kelly Baptista
      Jan 20 at 1:05



















    • 'oobbYQU' must be 'oObBYQU' :o

      – Kelly Baptista
      Jan 20 at 0:15











    • I have corrected the code to output correctly.

      – Joe Patten
      Jan 20 at 0:54











    • Worked! Thank you so much :)

      – Kelly Baptista
      Jan 20 at 1:05

















    'oobbYQU' must be 'oObBYQU' :o

    – Kelly Baptista
    Jan 20 at 0:15





    'oobbYQU' must be 'oObBYQU' :o

    – Kelly Baptista
    Jan 20 at 0:15













    I have corrected the code to output correctly.

    – Joe Patten
    Jan 20 at 0:54





    I have corrected the code to output correctly.

    – Joe Patten
    Jan 20 at 0:54













    Worked! Thank you so much :)

    – Kelly Baptista
    Jan 20 at 1:05





    Worked! Thank you so much :)

    – Kelly Baptista
    Jan 20 at 1:05













    0














    I would first collect your grid positions in a collections.defaultdict or sets, then rebuild the strings with lowercase letters if their positions exist in these sets.



    Demo:



    from collections import defaultdict

    grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]

    positions_words_occupy = (
    (0, 0),
    (1, 0),
    (2, 0),
    (3, 0),
    (0, 2),
    (0, 3),
    (0, 4),
    (0, 5),
    (3, 2),
    (4, 3),
    (5, 4),
    (2, 2),
    (2, 3),
    (2, 4),
    )

    d = defaultdict(set)
    for grid, pos in positions_words_occupy:
    d[grid].add(pos)

    result =
    for grid, pos in d.items():
    result.append(
    "".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
    )

    print(result)


    Output:



    ['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





    share|improve this answer






























      0














      I would first collect your grid positions in a collections.defaultdict or sets, then rebuild the strings with lowercase letters if their positions exist in these sets.



      Demo:



      from collections import defaultdict

      grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]

      positions_words_occupy = (
      (0, 0),
      (1, 0),
      (2, 0),
      (3, 0),
      (0, 2),
      (0, 3),
      (0, 4),
      (0, 5),
      (3, 2),
      (4, 3),
      (5, 4),
      (2, 2),
      (2, 3),
      (2, 4),
      )

      d = defaultdict(set)
      for grid, pos in positions_words_occupy:
      d[grid].add(pos)

      result =
      for grid, pos in d.items():
      result.append(
      "".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
      )

      print(result)


      Output:



      ['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





      share|improve this answer




























        0












        0








        0







        I would first collect your grid positions in a collections.defaultdict or sets, then rebuild the strings with lowercase letters if their positions exist in these sets.



        Demo:



        from collections import defaultdict

        grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]

        positions_words_occupy = (
        (0, 0),
        (1, 0),
        (2, 0),
        (3, 0),
        (0, 2),
        (0, 3),
        (0, 4),
        (0, 5),
        (3, 2),
        (4, 3),
        (5, 4),
        (2, 2),
        (2, 3),
        (2, 4),
        )

        d = defaultdict(set)
        for grid, pos in positions_words_occupy:
        d[grid].add(pos)

        result =
        for grid, pos in d.items():
        result.append(
        "".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
        )

        print(result)


        Output:



        ['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']





        share|improve this answer















        I would first collect your grid positions in a collections.defaultdict or sets, then rebuild the strings with lowercase letters if their positions exist in these sets.



        Demo:



        from collections import defaultdict

        grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]

        positions_words_occupy = (
        (0, 0),
        (1, 0),
        (2, 0),
        (3, 0),
        (0, 2),
        (0, 3),
        (0, 4),
        (0, 5),
        (3, 2),
        (4, 3),
        (5, 4),
        (2, 2),
        (2, 3),
        (2, 4),
        )

        d = defaultdict(set)
        for grid, pos in positions_words_occupy:
        d[grid].add(pos)

        result =
        for grid, pos in d.items():
        result.append(
        "".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
        )

        print(result)


        Output:



        ['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Jan 20 at 0:22

























        answered Jan 20 at 0:04









        RoadRunnerRoadRunner

        11.2k31340




        11.2k31340






























            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%2f54272334%2flower-elements-in-list-given-a-certain-position%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

            Liquibase includeAll doesn't find base path

            How to use setInterval in EJS file?

            Petrus Granier-Deferre