Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  73 4878
Sitat av Pope Vis innlegg
Det er derfor jeg kompilerer de så de kan brukes uten Python, men jeg synes pyinstaller, py2exe osv er en kålete måte å kompilere på. Finnes det andre måter å kjøre skriptene på, evt. andre måter å kompilere de på?
Vis hele sitatet...
Du kan åpne kommandolinjen og skrive "py sti/til/scripteditt.py". Om du har flere Python-versjoner installert, kan du enten bytte "py" til "py -3" eller inkludere "#! python3" (eller for cross platform-støtte: "#! /usr/bin/python3") som første linje i scriptet for å kjøre Python 3.x.

Men såpass ny Python som du kjører skal inkludere en launcher, og installeringen av den skal automatisk assosiere Python-filer med den. Så du skal kunne kjøre scriptet ved å dobbeltklikke på fila eller bare kjøre "sti/til/scriptetditt.py" i kommandolinjen. Dersom dobbeltklikkingen fører til noe annet i stedet, kan du se om å åpne med launcheren er et alternativ om du høyreklikker og velger "Åpne med..." eller hva det heter.
LEIK
Pope's Avatar
Trådstarter
Ok, da tror jeg kanskje det er Anaconda3/Spyder som roter det til. .py-filer er ikke assosiert med noe som helst på min pc. Dette kan jeg selvsagt gjøre noe med, men jeg har ikke sett noe standalone kommandolinje med installasjonen jeg bruker.
▼ ... over en måned senere ... ▼
LEIK
Pope's Avatar
Trådstarter
Pån igjen

Jeg har to lister med strings, en som inneholder en setning og en annen med visse uønskede bokstaver.

setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
letters = ["x", "y", "z", "æ", "ø", "å"]

Jeg ønsker å lage en funksjon som sjekker om elementer fra letters finnes i setning og erstatter disse uønskede bokstavene med "", slik at resultatet blir ["Jeg", "har", "en", "katt", "som", "heter", "Hans"].

Hvordan får jeg til dette? Har prøvd med doble for-løkker og tror dette kan være veien å gå, men blir så forvirret av å håndtere to lister samtidig. Anyone?

Jeg har et ganske ufullstendig forslag som ikke virker (duh), men er jeg ikke inne på noe her?

Kode

    nySetning = []
    for word in Setning:
        if word in letters:
            word = ""
        nySetning.append(word)
Ser forsåvidt her at nySetning i beste fall blir en blank liste.

Så jeg antar at jeg må bruke en else statement for å appende de ønskede bokstavene til nySetning i tillegg..
Sist endret av Pope; 11. april 2018 kl. 13:33. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Kanskje du kan kjøre en enkel Replace?
Kjedelig Streiting™
Realist1's Avatar
Tja. Mange måter å gjøre dette på. For å prøve å "fikse" din måte, så ville jeg vel kanskje gjort noe som dette:

Kode

setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
letters = ["x", "y", "z", "æ", "ø", "å"]

nySetning = []
for word in setning:
    nyttOrd = ""
    for letter in word:
        if letter not in letters:
            nyttOrd += letter
    nySetning.append(nyttOrd)

nySetning

Kode

new_sentence = []
for word in sentence:
    for letter in letters:
        new_word.replace(letter,"")
    new_sentence.append(new_word)
Burde funke. Uten at jeg har testet det. Det finnes sikkert langt mer elegante måter å gjøre det på enn å nøste for-løkker og få grisete kjøretid på det også
Sist endret av liasis; 11. april 2018 kl. 13:46.
Pre-kompilert regex er rimelig raskt på veldig store lister.
Mulig en generator hadde vært mer fornuftig om du har veldig mye data å sjekke.

Kode

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

import re

l1 = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
l2 = ["x", "y", "z", "æ", "ø", "å"]
r = re.compile('|'.join(l2))
l3 = [r.sub('', i) for i in l1]
print l3
LEIK
Pope's Avatar
Trådstarter
Takker
Jeg fikk ikke ditt forslag til å virke, liasis, da new_sentence blir lik som sentence.
Ditt forslag virker , Realist1.
For større lister blir sikkert dette ganske tidkrevende og det finnes sikkert bedre måter å gjøre det på, men jeg tar til takke med dette

Jeg skal teste kjøretid med ditt eksempel opp mot de andre, Goophy Takk!
Sist endret av Pope; 11. april 2018 kl. 14:03. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
For bitte små lister som dette er map eller list comprehension raskest.
Nøstede for-løkker er bare treigt.
LEIK
Pope's Avatar
Trådstarter
Noen forslag til hvordan jeg løser dette med list comprehension da? Helt uten å importere moduler.

Kode

[word.translate(None, ''.join(letters)) for word in setning]
Hvis du går gjennom det første forslaget ditt litt nøye, så vil du nok se at det alltid vil returnere den originale listen. "word in letters" vil alltid returnere false, siden det sjekker om word finnes som element i letters, og det gjør det jo ikke.
LEIK
Pope's Avatar
Trådstarter
Det har du veldig rett i Provo
Kunne du ha forklart meg hvordan koden din virker? translate og join er nytt for meg.
Sitat av Pope Vis innlegg
Det har du veldig rett i Provo
Kunne du ha forklart meg hvordan koden din virker? translate og join er nytt for meg.
Vis hele sitatet...
Mener ikke å være douche her, men det kan være lurt å se på dokumentasjonen. Der finner du begge funksjonene forklart. Sier dette fordi det å kunne lese dokumentasjon er noe av det viktigste når man koder, og jeg gremmes over at det ikke er større fokus på dette når folk skal lære det via høyskoler og universiteter.

Edit: en annen ting som kan være lurt, er å fyre opp python i terminal eller powershell og leke med funksjoner der om dokumentasjonen fremstår litt tunglest.
Sist endret av Xasma; 11. april 2018 kl. 15:06.
LEIK
Pope's Avatar
Trådstarter
Xasma: Det er det som noen ganger kan være problemet, at dokumentasjonen forvirrer meg ytterligere. Veldig greit å få ting forklart på en enkel måte av og til. Men takk for tipset om å teste i terminal, det skal jeg gjøre
String-metoden translate() gjør først og fremst en oversettelse, eller et ombytte, av characters i henhold til en translation table. Men den tar også et ekstra argument, deletechars, som er en streng med characters som skal slettes fra strengen den kalles på, og det er den funksjonaliteten jeg brukte i koden over. Ettersom jeg ikke var interessert i noe øvrig bytte av characters, sendte jeg bare None som translation table.

String-metoden join() tar en liste av strenger som argument, og bruker strengen den kalles på som delimiter og spleiser sammen alle strengene i listen. Så om du skriver for eksempel "+-+".join(["Hei", "sveis", "Pope"]), så vil den returnere strengen "Hei+-+sveis+-+Pope". I koden over brukte jeg en tom streng som delimiter, slik at den bare spleiset sammen alle bokstavene i letters-listen til en sammenhengende streng. Selvsagt kunne man jo bare definert dem som en streng i utgangspunktet og sluppet å kalle join(), men jeg gikk ut fra at du kanskje ikke hadde denne muligheten.
Sitat av Pope
Det har du veldig rett i Provo
Kunne du ha forklart meg hvordan koden din virker? translate og join er nytt for meg.
Vis hele sitatet...
Regner med at du bruker Python 3,til info der vil koden @Provo feile fordi dem har gjort om str.maketrans()
If there is only one argument, it must be a dictionary mapping
Vis hele sitatet...
Da kan det skrives sånn med et argument som er dictionary.

Kode

>>> setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
>>> letters = ["x", "y", "z", "æ", "ø", "å"]

>>> [s.translate({ord(c):'' for c in ''.join(letters)}) for s in setning]
['Jeg', 'har', 'en', 'katt', 'som', 'heter', 'Hans']
Viss man tar med str.maketrans(),kan det gjøres sånn uten dictionary.

Kode

>>> setning = ["Jexg", "hayr", "ezn", "katæt", "soøm", "heteår", "Hans"]
>>> remove = str.maketrans('', '', 'xyzæøå')
>>> [s.translate(remove) for s in setning]
['Jeg', 'har', 'en', 'katt', 'som', 'heter', 'Hans']
Noen forslag til hvordan jeg løser dette med list comprehension da? Helt uten å importere moduler.
Vis hele sitatet...
Tjaa i farta noe som dette,men det ble ikke noe pent(lesbart).
En eller flere linjer til hadde gjort det klarere.

Kode

>>> ''.join(c for x in setning for c in x+' ' if c not in 'xyzæøå').split()
['Jeg', 'har', 'en', 'katt', 'som', 'heter', 'Hans']
Sist endret av snippsat; 11. april 2018 kl. 22:06.
▼ ... over en måned senere ... ▼
LEIK
Pope's Avatar
Trådstarter
Nå har jeg tullet meg borti noe som kalles bitwise operators som jeg ikke skjønner skjønner så mye av.
Det gjelder følgende tegn: <<, >>, &, |, ~, ^.

Jeg fant en forklaring på det, men får det ikke til å stemme helt når jeg tester i Python.

  • x << y
    Returns x with the bits shifted to the left by y places (and new bits on the right-hand-side are zeros). This is the same as multiplying x by 2**y.
  • x >> y
    Returns x with the bits shifted to the right by y places. This is the same as //'ing x by 2**y.
  • x & y
    Does a "bitwise and". Each bit of the output is 1 if the corresponding bit of x AND of y is 1, otherwise it's 0.
  • x | y
    Does a "bitwise or". Each bit of the output is 0 if the corresponding bit of x AND of y is 0, otherwise it's 1.
  • ~ x
    Returns the complement of x - the number you get by switching each 1 for a 0 and each 0 for a 1. This is the same as -x - 1.
  • x ^ y
    Does a "bitwise exclusive or". Each bit of the output is the same as the corresponding bit in x if that bit in y is 0, and it's the complement of the bit in x if that bit in y is 1.
Vis hele sitatet...
Si at x = 5 og y = 7.

1) Den første er grei. Da vil x<<y = 5 * 2^7= 640.

2 ) Den andre er litt rar, men gjetter at det har med integerdivisjon å gjøre, så derfor får jeg ikke noe spesielt vettugt ut når jeg prøver x>>y = 5/(2^7) = 5/128. Blir bare 0, men det gir mening hvis man ikke regner med tatt mellom 0 og 1.

3) Hæ?

Kode

2&2
Out[69]: 2

2&3
Out[70]: 2

2&4
Out[71]: 0

2&5
Out[72]: 0

2&6
Out[73]: 2
4) Hæ?

Kode

2|2
Out[74]: 2

2|3
Out[75]: 3

2|4
Out[76]: 6

2|5
Out[77]: 7

2|6
Out[78]: 6
5) Denne er også grei. ~x = -5-1 = -6

6) Hæ?

Kode

2^2
Out[81]: 0

2^3
Out[82]: 1

2^4
Out[83]: 6

2^5
Out[84]: 7

2^6
Out[85]: 4
Så nummer 1, 2 og 5 er "greie". Skjønner likevel ikke når det skal være aktuelt å bruke de.

Grunnen til at jeg kom inn på dette var at jeg fikk se en kode med to lister (a og b) etterfulgt av set(a) | set(b), hvor set skal plukke ut unike verdier av en liste i uordnet rekkefølge.
Du må se på bits og hva som foregår når man sender de parvis, basert på posisjon inn i logiske porter og hva som da kommer ut.

Si du har 0110(6) og 1011(11) og gjør en bitwise AND-operasjon: da sammenligner du hvert bit, og hver gang begge tallene har 1 i samme posisjon, får du ut 1. Her er begge 1 kun i 2. posisjon, og dermed beholder du denne, mens de andre blir 0, og vi får 0010(2).

Så kan vi gjøre det samme med OR-operasjon: her trenger du kun at en av de to er 1, og dermed får du 1111, siden vi kan finne minst en ener i hver posisjon.

Til sist har vi XOR-operasjon: her ser vi etter 1'ere igjen, men her kan maksimalt én av input bitsene være 1, og dermed får vi 1101.

Når du leker med disse kan det være lurt å bruke bin(int), da får du ut hvordan de ser ut i bit-format.
Sist endret av Xasma; 1 uke siden kl. 10:44. Grunn: rettet småfeil
LEIK
Pope's Avatar
Trådstarter
Takk for flott svar Jeg har ikke sett på bits enda, nei.
Hva er det som står i parenteser etter bits-rekkene(?) dine?

Testet bin(int) og det var naturligvis også helt nytt, men her er det mulig å lære ting Takk igjen!
Sitat av Pope Vis innlegg
Takk for flott svar Jeg har ikke sett på bits enda, nei.
Hva er det som står i parenteser etter bits-rekkene(?) dine?

Testet bin(int) og det var naturligvis også helt nytt, men her er det mulig å lære ting Takk igjen!
Vis hele sitatet...
Det er tallet i titallsystemet, burde vel ha brukt skikkelig notasjon, men gadd ikke i farten. Uten å gå for dypt i det, så bruker maskiner 2 som base for tallsystemet mens vi normalt bruker 10 som base. En kort forklaring, som blir litt rotete siden vi ikke har LaTeX tilgjengelig: Fra høyre leses binære tall som toerpotenser, så f.eks 1010 i binært blir i konvertering ti titallsystemet: ((2^0)*0)+((2^1)*1)+((2^2)*0)+((2^3)*1) = 10. Du ikke gjøre det i den rekkefølgen, men det kan være greit i starten. Så lenge man forstår at det er en summering av toerpotenser, lest fra høyre til venstre og en 1 representerer at denne toerpotensen trengs for å uttrykke et tall, henger du med.

Bitmanipulasjon brukes i mye rart, kryptering bruker f.eks XOR-ing i visse implementasjoner, men også mye annet. Bitmanipulasjon er hendig til en del ting, men for de aller fleste ikke noe mer enn en kuriositet.
Sist endret av Xasma; 1 uke siden kl. 13:09.
Nawesome
Provo's Avatar
Crew
Sitat av Xasma Vis innlegg
Fra høyre leses binære tall som toerpotenser, så f.eks 1010 i binært blir i konvertering ti titallsystemet: ((2^0)*0)+((2^1)*1)+((2^2)*0)+((2^3)*1) = 10.
Vis hele sitatet...
Det kan være greit å legge til at det er det samme som skjer med andre tallsystemer, inkludert titallssystemet, eller det desimale tallsystemet som det også kalles. Man summerer sifrene ganget med basen opphøyd i sin posisjon, hvor man begynner å telle fra null.

I titallssystemet, hvor vi i praksis overfører fra titallssystemet til titallssystemet:
5 = 5*100
17 = 7*100 + 1*101
54987 = 7*100 + 8*101 + 9*102 + 4*103 + 5*104

For å gjøre om binært til titallssystemet:
1010bin = 0*20 + 1*21 + 0*22 + 1*23 = 10.

Det heksadesimale tallsystemet er som alle andre, bare at det har 16 som base. Siden det må være 16 siffer, er sifrene 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E og F. Fremgangsmåten er lik:
7D4Ahex = 10*160 + 4*161 + 13*162 + 7*163 = 32074.



Man kan lett bli forvirret av andre tallsystemer om man ikke har erfaring med det. Men det kan hjelpe på forståelsen å visualisere et mekanisk telleapparat av typen man bruker for å telle flypassasjerer og liknende. Hver gang man trykker på knappen, øker tallet med 1. Der har man en rekke hjul, antallet avhenger av hvor mange siffer den har, ikke utseendemessig ulikt snurrehjulene på en vanlig mekanisk kodelås som ofte er på kofferter og hengelåser, eller tellehjulene på gamle kassettspillere.

Først begynner apparatet på 000, om det har tre siffer. Når du trykker på knappen, snurrer det første hjulet en tidels runde rundt, og viser sifferet 1, slik at apparatet nå viser 001. Trykker du igjen går det til 002, også videre. Når du har kommet til det siste sifferet, 9, så vil det som skjer når du trykker være at det første hjulet snurrer over til 0 igjen, men drar med seg neste hjul en tidels runde, slik at det nå står 010. Så går det til 011, 012, 013 også videre. Ved 019 vil neste trykk gjøre at første hjul drar med seg andre hjul over en tidelsrunde til, slik at man kan lese 020. Hjul nummer to vil også dra med seg hjul nummer tre, når det går rundt fra det høyeste til det laveste sifferet, så på 099 vil neste trykk dra første hjul over til laveste siffer, som drar andre hjul over til laveste siffer, som drar tredje hjul over på 1, slik at man får 100 – hundre, altså.

Så er det bare å bytte base. Heksadesimalt er det akkurat det samme som skjer, men der har man sifrene A, B, C, D, E og F i tillegg. Så hjulet har 16 posisjoner (0-F) i stedet for ti (0-9). Når det første hjulet snurrer fra F (desimalt 15) til 0, drar det med seg neste hjul et hakk, og det heksadesimale telleapparatet viser 010 der det desimale telleapparatet viser 016. Neste er 011, så 012 også videre.

Binært, samme prinsipp, bare at der har vi kun to siffer, og ikke ti eller 16. Du begynner å telle, og apparatet går fra 000 til 001. Allerede neste trykk går nederste hjul fra høyeste til laveste siffer, og drar med seg det foran et hakk, så man får 010. Neste trykk gir 011. Deretter drar det første hjulet med seg det andre hjulet som drar med seg det tredje hjulet, og vi får 100. Og sånn fortsetter det videre oppover.
Sist endret av Provo; 1 uke siden kl. 14:35.
LEIK
Pope's Avatar
Trådstarter
Jøss, har hørt om nuller og enere før, men at det var sånn det hang sammen var jeg ikke klar over.

Bit-rekkene(?) kan være lengre enn fire plasser? Hvis ikke kan man ikke få større tall enn 1111(17)?

Hvor viktig er dette for Pythonprogrammering i praksis? Har ikke vært nevnt i informatikkfaget jeg har.

Sweet Jesus, Provo. Åpenbaring
Takker og bukker!
Sist endret av Pope; 1 uke siden kl. 14:33. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Nawesome
Provo's Avatar
Crew
Bit-rekkene kan være mye lenger enn fire plasser. På en datamaskin ofte 32 eller 64, men det avhenger av datatypen. Dette er ikke spesielt viktig for python-programmering, med mindre du programmerer noe hvis hensikt er bitmanipulasjon.

Jeg burde vel nevnt at det er noen knep for å representere negative tall, og også desimaltall, men det blir fort litt mer avansert enn nødvendig for å forstå det helt grunnleggende.

(Og binært 1111 er desimalt 15, ikke 17 )
LEIK
Pope's Avatar
Trådstarter
Edit: mente 15, ikke 17.
Hehe, her går det unna.

Akkurat, derav 32- og 64-bit som man har hørt om et helt liv!
Sist endret av Pope; 1 uke siden kl. 14:36.