Vinnaren i pepparkakshustävlingen!
2022-08-03, 00:32
  #2065
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av janblommgren
Hej, string.replace struntar i count parametern då jag försöker ersätta ettorna i början under med
strängen 'H'. Bara de tre första ettorna jag vill ersätta med 'H'. I koden under hoppar ettorna in längre
i listan även om jag satt count parametern 3

(Ja jag kunde manuellt ha lagt in de första H:na,men nästa steg är att( allt eftersom )ersätta
2rna med 'He', 3.orna med 'Li',4-orna med 'Be', osv upp till 96-orna som ersätts med 'Cm'

Googlat mig tokig men hittar inte det( uppenbara?) svaret.
count parametern kanske bara funkar på enstaka sträng istället för lista av strängar?
Kod:
import re
lista1=['1', '1', '1', '2', '2', '3', '3', '4', '5', '5', '6', '7', '7', '8', '8', '31', '31', '32', '32', '32', '32', '32', '33', '33', '34', '34', '34', '34', '34', '34', '34', '35', '35', '36', '36', '36', '36', '36', '36', '36', '37', '37', '37', '38', '38', '38', '38', '38', '38', '39', '39', '39', '40', '40', '40', '40', '40', '40', '40', '41', '41', '41', '42', '42', '42', '42', '42', '42', '42', '42', '43', '44', '44', '44', '44', '44', '44', '44', '44', '44', '45', '45', '46', '46', '46', '46', '46', '46', '46', '47', '47', '47', '47', '48', '48', '48', '48', '48', '48', '48', '48', '48', '48', '49', '49', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '51', '51', '51', '51', '51', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '53', '53', '53', '53', '53', '54', '54', '54', '54', '54', '54', '54', '54', '54', '54', '55', '55', '55', '55', '55', '56', '56', '56', '56', '56', '56', '56', '56', '57', '57', '57', '58', '58', '58', '58', '58', '58', '58', '59', '59', '59', '60', '60', '60', '60', '60', '60', '60', '60', '61', '61', '61', '61', '61', '62', '62', '62', '62', '62', '62', '62', '62', '62', '63', '63', '63', '63', '63', '63', '63', '64', '64', '64', '64', '64', '64', '64', '64', '65', '65', '66', '66', '66', '66', '66', '66', '66', '67', '67', '68', '68', '68', '68', '68', '68', '92', '92', '92', '92', '92', '92', '92', '92', '92', '92', '93', '93', '93', '93', '93', '94', '94', '94', '94', '94', '94', '94', '94', '94', '95', '95', '95', '95', '95', '95', '96', '96', '96', '96', '96', '96', '96', '96', '96', '96', '96']
nylist=[]
for string in lista1:
      nystring=string.replace('1','H',3)
      nylist.append(nystring)
print(nylist)
Vad vill du åstadkomma med count=3?

String.replace behandlar en sträng och count-argumentet begränsar enbart antalet ersättningar i strängen. I din kod ger du funktionen en sträng från en lista.

Är det som du vill göra att byta ut atomnummer mot atombeteckningar?
I så fall bör du göra en dict där nyckel är atomnumret du ska omvandla från och värdet är atombeteckningen. Sen är bara att köra din lista och byta ut varje atomnummer mot atombeteckningen i dicten.
Citera
2022-08-03, 00:36
  #2066
Moderator
vhes avatar
Citat:
Ursprungligen postat av janblommgren
count parametern kanske bara funkar på enstaka sträng istället för lista av strängar?

str.replace() agerar på strängar, inte på listor. Du loopar över varje sträng i listan, och begär att upp till tre ettor i varje enskild sträng i listan skall bytas ut mot H.

Är det så att du försöker byta ut atomnummer mot beteckning. Då är det ju inte en substitution av enskilda tecken du vill göra, då är det ju hela elementet du vill titta på:
Kod:
new_list = []
for element in lista1:
    if element == '1':
        new_list.append('H')
    elif element == '2':
        new_list.append('He')
    elif ...

Sedan finns det smidigare sätt att göra detta på, men vi håller det på den nivån f.t. Men str.replace() är inte funktionen du söker.

[edit]: Med "smidigare sätt" syftade jag just på metoden Enterprise föreslog. Kör på det om du lyckas förstå hur du skall göra :-)
__________________
Senast redigerad av vhe 2022-08-03 kl. 00:39.
Citera
2022-08-03, 00:42
  #2067
Medlem
Citat:
Ursprungligen postat av Enterprise
Vad vill du åstadkomma med count=3?

String.replace behandlar en sträng och count-argumentet begränsar enbart antalet ersättningar i strängen. I din kod ger du funktionen en sträng från en lista.

Är det som du vill göra att byta ut atomnummer mot atombeteckningar?
I så fall bör du göra en dict där nyckel är atomnumret du ska omvandla från och värdet är atombeteckningen. Sen är bara att köra din lista och byta ut varje atomnummer mot atombeteckningen i dicten.
Tack-
Ville med count att bara de tre första 1rna skulle ersättas med H. Ja Atomnumren ska ersättas av atombeteckningar-får titta på dict-metoden.
Citera
2022-08-03, 09:07
  #2068
Medlem
Du tänker rätt; att countparametern i string.replace() bara ersätter de första tre träffarna. Men det du skall ersätta är ju själva elementet i listan lista1, inte ett tecken i strängen som är i listan. Därför kan du inte använda strängmanipulering på elementen, då '1' är enbart en sträng med en etta och inte en sträng med '111'.


Hmm en liten nödlösning på din fråga:

Kod:
for i, e in enumerate(lista1):
      if e == '1':
          lista1.pop(i)
          lista1.insert(i, 'H')


Sedan får du göra en dict där atomnummer är nyckeln och beteckningen är värdet. Sedan ersätter du mitt 'H' med dict[e] och tar bort if e=='1'


Dictversionen kan se ut som följande:

Kod:
for i, e in enumerate(lista1):
      
          lista1.pop(i)
          lista1.insert(i, dic[e])

Varför går jag denna långa väg i en lista? Jo, för indexeringen kan vara viktig och då är det bäst att ersätta rätt element på rätt index. Kör man list.pop(i) och sedan list.insert(i, e) hamnar e på exakt samma position som du ville ersätta. List.pop(i) tar bort elementet i just den positionen och list.insert(i,e) sätter dit element i just index i.

Men att göra en dict av periodiska systemet är ju lika jobbigt som att manuellt ändra i din lista1 från början, om du inte hittar någon lista där du kan parsa nummer och beteckning och stoppa in i en dict.
__________________
Senast redigerad av Methos 2022-08-03 kl. 09:22.
Citera
2022-08-03, 11:48
  #2069
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Methos

Men att göra en dict av periodiska systemet är ju lika jobbigt som att manuellt ändra i din lista1 från början, om du inte hittar någon lista där du kan parsa nummer och beteckning och stoppa in i en dict.

Automation to the rescue! Provade att göra en request i Python, men hemsidorna var lite kinkiga så jag fuskade med JS direkt i browsern vilket brukar gå bra när man enbart behöver hämta "engångsdata" som det här.

1. Surfa till https://www.periodictable.one/elements/

2. Tryck F12 och ta fram konsoll/console.

3. Klistra in följande kod:
Kod:
(function getPeriodicTable(){

    
let returnObj={};
    
    const 
tbody=document.querySelector("#listofelements > tbody");
    
    const 
lns=tbody.querySelectorAll("tr");
  
    
lns.forEach(function(ln){
        const 
nr=ln.querySelector("td.c-nr").innerText;
        const 
symbol=ln.querySelector("td.c-symbol").innerText;
        
returnObj[nr]=symbol;
    });

    return 
JSON.stringify(returnObj);
            
})(); 

4. Du får nu i konsollen den önskade dicten i en JSON-sträng.

5. Kopiera textsträngen in i Python-miljön.
6. Omvandla textsträngen till dict

Kod:
import json
js
='{"1":"H","2":"He","3":"Li","4":"Be","5":"B","6":"C","7":"N","8":"O","9":"F","10":"Ne","11":"Na","12":"Mg","13":"Al","14":"Si","15":"P","16":"S","17":"Cl","18":"Ar","19":"K","20":"Ca","21":"Sc","22":"Ti","23":"V","24":"Cr","25":"Mn","26":"Fe","27":"Co","28":"Ni","29":"Cu","30":"Zn","31":"Ga","32":"Ge","33":"As","34":"Se","35":"Br","36":"Kr","37":"Rb","38":"Sr","39":"Y","40":"Zr","41":"Nb","42":"Mo","43":"Tc","44":"Ru","45":"Rh","46":"Pd","47":"Ag","48":"Cd","49":"In","50":"Sn","51":"Sb","52":"Te","53":"I","54":"Xe","55":"Cs","56":"Ba","57":"La","58":"Ce","59":"Pr","60":"Nd","61":"Pm","62":"Sm","63":"Eu","64":"Gd","65":"Tb","66":"Dy","67":"Ho","68":"Er","69":"Tm","70":"Yb","71":"Lu","72":"Hf","73":"Ta","74":"W","75":"Re","76":"Os","77":"Ir","78":"Pt","79":"Au","80":"Hg","81":"Tl","82":"Pb","83":"Bi","84":"Po","85":"At","86":"Rn","87":"Fr","88":"Ra","89":"Ac","90":"Th","91":"Pa","92":"U","93":"Np","94":"Pu","95":"Am","96":"Cm","97":"Bk","98":"Cf","99":"Es","100":"Fm","101":"Md","102":"No","103":"Lr","104":"Rf","105":"Db","106":"Sg","107":"Bh","108":"Hs","109":"Mt","110":"Ds","111":"Rg","112":"Cn","113":"Nh","114":"Fl","115":"Mc","116":"Lv","117":"Ts","118":"Og"}'
dct=json.loads(js

Att lägga märke till är att nyckeln (atomnumret) blir i strängformat pga hur JS konstrurerar JSON-strängen (även om man skulle göra atomnumret till ett heltal i JS-koden).
Citera
2022-08-03, 11:59
  #2070
Medlem
roleones avatar
Citat:
Ursprungligen postat av janblommgren
Hej, string.replace struntar i count parametern då jag försöker ersätta ettorna i början under med
strängen 'H'. Bara de tre första ettorna jag vill ersätta med 'H'. I koden under hoppar ettorna in längre
i listan även om jag satt count parametern 3

(Ja jag kunde manuellt ha lagt in de första H:na,men nästa steg är att( allt eftersom )ersätta
2rna med 'He', 3.orna med 'Li',4-orna med 'Be', osv upp till 96-orna som ersätts med 'Cm'

Googlat mig tokig men hittar inte det( uppenbara?) svaret.
count parametern kanske bara funkar på enstaka sträng istället för lista av strängar?
Kod:
import re
lista1=['1', '1', '1', '2', '2', '3', '3', '4', '5', '5', '6', '7', '7', '8', '8', '31', '31', '32', '32', '32', '32', '32', '33', '33', '34', '34', '34', '34', '34', '34', '34', '35', '35', '36', '36', '36', '36', '36', '36', '36', '37', '37', '37', '38', '38', '38', '38', '38', '38', '39', '39', '39', '40', '40', '40', '40', '40', '40', '40', '41', '41', '41', '42', '42', '42', '42', '42', '42', '42', '42', '43', '44', '44', '44', '44', '44', '44', '44', '44', '44', '45', '45', '46', '46', '46', '46', '46', '46', '46', '47', '47', '47', '47', '48', '48', '48', '48', '48', '48', '48', '48', '48', '48', '49', '49', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '50', '51', '51', '51', '51', '51', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '52', '53', '53', '53', '53', '53', '54', '54', '54', '54', '54', '54', '54', '54', '54', '54', '55', '55', '55', '55', '55', '56', '56', '56', '56', '56', '56', '56', '56', '57', '57', '57', '58', '58', '58', '58', '58', '58', '58', '59', '59', '59', '60', '60', '60', '60', '60', '60', '60', '60', '61', '61', '61', '61', '61', '62', '62', '62', '62', '62', '62', '62', '62', '62', '63', '63', '63', '63', '63', '63', '63', '64', '64', '64', '64', '64', '64', '64', '64', '65', '65', '66', '66', '66', '66', '66', '66', '66', '67', '67', '68', '68', '68', '68', '68', '68', '92', '92', '92', '92', '92', '92', '92', '92', '92', '92', '93', '93', '93', '93', '93', '94', '94', '94', '94', '94', '94', '94', '94', '94', '95', '95', '95', '95', '95', '95', '96', '96', '96', '96', '96', '96', '96', '96', '96', '96', '96']
nylist=[]
for string in lista1:
      nystring=string.replace('1','H',3)
      nylist.append(nystring)
print(nylist)

Det "uppenbara svaret" är att count propertien du satt är för hur många ettor som ska replace:as per sträng, inte hur många strängar du ska göra det på. Om du bara vill att de tre första ettorna ska påverkas behöver du begränsa din for-loop till att bara göra tre iterationer, exempelvis genom en fast range.
Citera
2022-08-03, 12:35
  #2071
Medlem
Citat:
Ursprungligen postat av Enterprise

Att lägga märke till är att nyckeln (atomnumret) blir i strängformat pga hur JS konstrurerar JSON-strängen (även om man skulle göra atomnumret till ett heltal i JS-koden).

Oh, bra jobbat!

Att nyckeln är i strängformat spelar ju ingen roll då hans lista också är i strängformat. Han behöver då inte casta om i jämförelsen.
Citera
2022-08-04, 00:41
  #2072
Medlem
Citat:
Ursprungligen postat av Enterprise
Automation to the rescue! Provade att göra en request i Python, men hemsidorna var lite kinkiga så jag fuskade med JS direkt i browsern vilket brukar gå bra när man enbart behöver hämta "engångsdata" som det här.

1. Surfa till https://www.periodictable.one/elements/

2. Tryck F12 och ta fram konsoll/console.

3. Klistra in följande kod:
Kod:
(function getPeriodicTable(){

    
let returnObj={};
    
    const 
tbody=document.querySelector("#listofelements > tbody");
    
    const 
lns=tbody.querySelectorAll("tr");
  
    
lns.forEach(function(ln){
        const 
nr=ln.querySelector("td.c-nr").innerText;
        const 
symbol=ln.querySelector("td.c-symbol").innerText;
        
returnObj[nr]=symbol;
    });

    return 
JSON.stringify(returnObj);
            
})(); 

4. Du får nu i konsollen den önskade dicten i en JSON-sträng.

5. Kopiera textsträngen in i Python-miljön.
6. Omvandla textsträngen till dict

Kod:
import json
js
='{"1":"H","2":"He","3":"Li","4":"Be","5":"B","6":"C","7":"N","8":"O","9":"F","10":"Ne","11":"Na","12":"Mg","13":"Al","14":"Si","15":"P","16":"S","17":"Cl","18":"Ar","19":"K","20":"Ca","21":"Sc","22":"Ti","23":"V","24":"Cr","25":"Mn","26":"Fe","27":"Co","28":"Ni","29":"Cu","30":"Zn","31":"Ga","32":"Ge","33":"As","34":"Se","35":"Br","36":"Kr","37":"Rb","38":"Sr","39":"Y","40":"Zr","41":"Nb","42":"Mo","43":"Tc","44":"Ru","45":"Rh","46":"Pd","47":"Ag","48":"Cd","49":"In","50":"Sn","51":"Sb","52":"Te","53":"I","54":"Xe","55":"Cs","56":"Ba","57":"La","58":"Ce","59":"Pr","60":"Nd","61":"Pm","62":"Sm","63":"Eu","64":"Gd","65":"Tb","66":"Dy","67":"Ho","68":"Er","69":"Tm","70":"Yb","71":"Lu","72":"Hf","73":"Ta","74":"W","75":"Re","76":"Os","77":"Ir","78":"Pt","79":"Au","80":"Hg","81":"Tl","82":"Pb","83":"Bi","84":"Po","85":"At","86":"Rn","87":"Fr","88":"Ra","89":"Ac","90":"Th","91":"Pa","92":"U","93":"Np","94":"Pu","95":"Am","96":"Cm","97":"Bk","98":"Cf","99":"Es","100":"Fm","101":"Md","102":"No","103":"Lr","104":"Rf","105":"Db","106":"Sg","107":"Bh","108":"Hs","109":"Mt","110":"Ds","111":"Rg","112":"Cn","113":"Nh","114":"Fl","115":"Mc","116":"Lv","117":"Ts","118":"Og"}'
dct=json.loads(js

Att lägga märke till är att nyckeln (atomnumret) blir i strängformat pga hur JS konstrurerar JSON-strängen (även om man skulle göra atomnumret till ett heltal i JS-koden).
Tack så mycket.
Om jag nu använder din dictionary upp till och med "96":"Cm" för att försöka ombilda
min lista av atomnr till enbart symboler enligt:
Kod:
periodic={"1":"H","2":"He","3":"Li","4":"Be","5":"B","6":"C","7":"N","8":"O","9":"F",
"10":"Ne","11":"Na","12":"Mg","13":"Al","14":"Si","15":"P","16":"S","17":"Cl","18":"Ar",
"19":"K","20":"Ca","21":"Sc","22":"Ti","23":"V","24":"Cr","25":"Mn","26":"Fe","27":"Co",
"28":"Ni","29":"Cu","30":"Zn","31":"Ga","32":"Ge","33":"As","34":"Se","35":"Br","36":"Kr",
"37":"Rb","38":"Sr","39":"Y","40":"Zr","41":"Nb","42":"Mo","43":"Tc","44":"Ru","45":"Rh",
"46":"Pd","47":"Ag","48":"Cd","49":"In","50":"Sn","51":"Sb","52":"Te","53":"I","54":"Xe",
"55":"Cs","56":"Ba","57":"La","58":"Ce","59":"Pr","60":"Nd","61":"Pm","62":"Sm","63":"Eu"
,"64":"Gd","65":"Tb","66":"Dy","67":"Ho","68":"Er","69":"Tm","70":"Yb","71":"Lu","72":"Hf",
"73":"Ta","74":"W","75":"Re","76":"Os","77":"Ir","78":"Pt","79":"Au","80":"Hg","81":"Tl",
"82":"Pb","83":"Bi","84":"Po","85":"At","86":"Rn","87":"Fr","88":"Ra","89":"Ac","90":"Th",
"91":"Pa","92":"U","93":"Np","94":"Pu","95":"Am","96":"Cm"}


at_nums=['1', '1', '1', '2', '2', '3', '3', '4', '5', '5', '6', '7', '7', '8', '8', '31',\
         '31', '32', '32', '32', '32', '32', '33', '33', '34', '34', '34', '34', '34', '34',\
         '34', '35', '35', '36', '36', '36', '36', '36', '36', '36', '37', '37', '37', '38',\
         '38', '38', '38', '38', '38', '39', '39', '39', '40', '40', '40', '40', '40', '40',\
         '40', '41', '41', '41', '42', '42', '42', '42', '42', '42', '42', '42', '43', '44',\
         '44', '44', '44', '44', '44', '44', '44', '44', '45', '45', '46', '46', '46', '46',\
         '46', '46', '46', '47', '47', '47', '47', '48', '48', '48', '48', '48', '48', '48',\
         '48', '48', '48', '49', '49', '50', '50', '50', '50', '50', '50', '50', '50', '50',\
         '50', '50', '50', '50', '50', '51', '51', '51', '51', '51', '52', '52', '52', '52',\
         '52', '52', '52', '52', '52', '52', '52', '52', '52', '53', '53', '53', '53', '53', \
         '54', '54', '54', '54', '54', '54', '54', '54', '54', '54', '55', '55', '55', '55',\
         '55', '56', '56', '56', '56', '56', '56', '56', '56', '57', '57', '57', '58', '58',\
         '58', '58', '58', '58', '58', '59', '59', '59', '60', '60', '60', '60', '60', '60',\
         '60', '60', '61', '61', '61', '61', '61', '62', '62', '62', '62', '62', '62', '62',\
         '62', '62', '63', '63', '63', '63', '63', '63', '63', '64', '64', '64', '64', '64',\
         '64', '64', '64', '65', '65', '66', '66', '66', '66', '66', '66', '66', '67', '67',\
         '68', '68', '68', '68', '68', '68', '92', '92', '92', '92', '92', '92', '92', '92', \
         '92', '92', '93', '93', '93', '93', '93', '94', '94', '94', '94', '94', '94', '94',\
         '94', '94', '95', '95', '95', '95', '95', '95', '96', '96', '96', '96', '96', '96',\
         '96', '96', '96', '96', '96']



for key in periodic:
    for v in at_nums:
        if at_nums[v]==key:    #om atomnummer i at_nums = nyckeltalet i periodic
            at_nums[v]=periodic[key]  #så ersätt atomnumret med atomsymbolen från periodic dictionary
        
print(at_nums)    
Jag får då
Kod:
TypeError: list indices must be integers or slices, not str
Går ej att loopa på detta viset.
Testade också med map metoden enligt
Kod:
at_num_to_symbol=list(map(at_nums,periodic.items()))
Men fick då att
Kod:
list object is not callable
Citera
2022-08-04, 10:25
  #2073
Medlem
Du försöker ju kolla via index och objekt. Testa:



Kod:
for key in periodic:
    for i,  v in enumerate( at_nums):
        if v ==key:    #om atomnummer i at_nums = nyckeltalet i periodic
            at_nums[i]=periodic[key]  #så ersätt atomnumret med atomsymbolen från periodic dictionary
        
print(at_nums)    


Varför fungerar inte min lösning jag gjorde åt dig?

Du kommer till och med undan med en förkortad version:

Kod:
for i, e in enumerate(lista1):
                lista1[i] = dic[e])
__________________
Senast redigerad av Methos 2022-08-04 kl. 10:39.
Citera
2022-08-04, 12:00
  #2074
Medlem
Citat:
Ursprungligen postat av Methos
Du försöker ju kolla via index och objekt. Testa:



Kod:
for key in periodic:
    for i,  v in enumerate( at_nums):
        if v ==key:    #om atomnummer i at_nums = nyckeltalet i periodic
            at_nums[i]=periodic[key]  #så ersätt atomnumret med atomsymbolen från periodic dictionary
        
print(at_nums)    


Varför fungerar inte min lösning jag gjorde åt dig?

Du kommer till och med undan med en förkortad version:

Kod:
for i, e in enumerate(lista1):
                lista1[i] = dic[e])
Stort tack!-de funkar(båda två) .
Citera
2022-08-04, 12:14
  #2075
Medlem
Citat:
Ursprungligen postat av janblommgren
Stort tack!-de funkar(båda två) .

Ja, jag körde själv båda genom ipython.
Men den förkortade versionen är den bästa för dig, för den optimerar din kod.
Men se upp så du inte får en massa buggar.
Citera
2022-08-04, 14:11
  #2076
Medlem
En rejält klumpig fråga:

Hur gör jag en subclass av np.ndarray så att jag kan få alla metoder och funktionaliteter som np.array() har, men slippa en oläslig kod? Jag vill att min array([1,0,0]) skall ha alla metoder som np.array har, men jag vill också kunna ta fram kolumnerna med array.x, array.y osv istället för det oläsliga list_index array[0],

Jag försökte med en enkel klass , men gick bet:

Kod:
import numpy as np

class Vec:
    def __init__(self, x, y, z):
        v = np.array([x, y, z])
        self.x = v[0]
        self.y = v[1]
        self.z = v[2]
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback