Extract text from a list to create dictionary - python

I have a list of product description like this:
l = ['Thương hiệu Kingston',
'Kích thước Đang cập nhật',
'Model 3.0 DT100G3 - 64GB',
'Xuất xứ Đài Loan',
'SKU 6100242115914',
'MÔ TẢ SẢN PHẨM',
'Dung lượng 64GB',
'Vỏ kim loại chắc chắn và bền bỉ',
'USB 3.0 tốc độ cao',
'Nhỏ gọn dễ dàng mang theo bên mình',
'Thiết kế không nắp kiểu dáng thời trangTương thích với hầu hết các hệ điều hành',
'Thiết kế mạnh mẽ',
'USB Kingston DT100G3 - 64GB - USB 3.0 mang trên mình lớp vỏ ngoài mạnh mẽ, vuông vắn với nền tảng nhựa nhám đen. Bốn cạnh được bo vát tròn hạn chế đâm chọt khi mang theo trong túi quần, túi áo. Phần đầu còn lại có rãnh xỏ dây cho phép bạn ghép đôi chiếc USB này đến những vật bất ly thân như chìa khóa chẳng hạn.',
'Tốc độ nhanh chóng với chuẩn 3.0',
'Sử dụng công nghệ USB 3.0 giúp truyền tải dữ liệu giữa máy tính và các thiết bị một cách nhanh chóng và an toàn nhất. Dùng lượng lưu trữ 64GB giúp bạn thoải mái trong việc lưu trữ và chia sẻ văn bản, âm nhạc, videos.',
'Nắp đậy an toàn, thời trang',
'Khác với kiểu USB đậy nắp thường thấy, USB Kingston 64GB DT100G3 có màn biến hình khá ấn tượng kiểu “ lên đạn súng lục” bằng cách trượt phần vỏ để lộ ra đầu giao tiếp 3.0 ẩn bên trong. Kiểu thiết kế này rất hữu ích khi không còn sợ thất lạc nắp đậy, giữ cho đầu giao tiếp được bảo bọc an toàn.',
'Tính năng Plug and Play',
'Bên cạnh đó, usb với tính năng Plug and Play, bạn chỉ cần cắm vào máy tính là có thể sử dụng không cần phải cài đặt bất kỳ phần mềm nào khác.',
'Khả năng tương thích cao',
'Kingston DT100G3 được trang bị cổng kết nối USB 3.0 giúp truyền tải dữ liệu với tốc độ nhanh gấp nhiều lần so với cổng 2.0. Đồng thời, cổng USB 3.0 cũng tương thích ngược với USB 2.0. Bạn có thể kết nối dễ dàng với thiết bị thông qua cổng USB 3.0 và sử dụng ngay mà không cần cài đặt bất kì phần mềm nào.',
'']
Questions: How can I extract a part of text in this list? Specifically, I want to extract and make a dictionary with key = "MÔ TẢ SẢN PHẨM" and all the remaining lines after "MÔ TẢ SẢN PHẨM" will be the value.
dic = {'MÔ TẢ SẢN PHẨM': "Dung lượng 64GB, Vỏ kim loại chắc chắn và bền bỉ',
USB 3.0 tốc độ cao, Nhỏ gọn dễ dàng mang theo bên mình, Thiết kế không nắp kiểu dáng thời trang Tương thích với hầu hết các hệ điều hành, Thiết kế mạnh mẽ, USB Kingston DT100G3 - 64GB - USB 3.0 mang trên mình lớp vỏ ngoài mạnh mẽ, vuông vắn với nền tảng nhựa nhám đen. Bốn cạnh được bo vát tròn hạn chế đâm chọt khi mang theo trong túi quần, túi áo. Phần đầu còn lại có rãnh xỏ dây cho phép bạn ghép đôi chiếc USB này đến những vật bất ly thân như chìa khóa chẳng hạn., Tốc độ nhanh chóng với chuẩn 3.0, Sử dụng công nghệ USB 3.0 giúp truyền tải dữ liệu giữa máy tính và các thiết bị một cách nhanh chóng và an toàn nhất. Dùng lượng lưu trữ 64GB giúp bạn thoải mái trong việc lưu trữ và chia sẻ văn bản, âm nhạc, videos., Nắp đậy an toàn, thời trang, Khác với kiểu USB đậy nắp thường thấy, USB Kingston 64GB DT100G3 có màn biến hình khá ấn tượng kiểu “ lên đạn súng lục” bằng cách trượt phần vỏ để lộ ra đầu giao tiếp 3.0 ẩn bên trong. Kiểu thiết kế này rất hữu ích khi không còn sợ thất lạc nắp đậy, giữ cho đầu giao tiếp được bảo bọc an toàn., Tính năng Plug and Play, Bên cạnh đó, usb với tính năng Plug and Play, bạn chỉ cần cắm vào máy tính là có thể sử dụng không cần phải cài đặt bất kỳ phần mềm nào khác., Khả năng tương thích cao, Kingston DT100G3 được trang bị cổng kết nối USB 3.0 giúp truyền tải dữ liệu với tốc độ nhanh gấp nhiều lần so với cổng 2.0. Đồng thời, cổng USB 3.0 cũng tương thích ngược với USB 2.0. Bạn có thể kết nối dễ dàng với thiết bị thông qua cổng USB 3.0 và sử dụng ngay mà không cần cài đặt bất kì phần mềm nào."}

Here is a solution which creates a dictionary from the first occurrence of key. The result dictionary is empty if key does not exist in l.
key = "MÔ TẢ SẢN PHẨM"
result = {}
for i, line in enumerate(l):
if line == key:
result[key] = ", ".join(l[i:])
break

Assuming that the string that you are making the key is known and will be present in full within the list as a single string, you can get the index of the key and sublist the rest of the list. Afterwards, convert the sublist into a substring using string join, then place the key and value into a dictionary.
l = ['Thương hiệu Kingston',
'Kích thước Đang cập nhật',
'Model 3.0 DT100G3 - 64GB',
'Xuất xứ Đài Loan',
'SKU 6100242115914',
'MÔ TẢ SẢN PHẨM',
'Dung lượng 64GB',
'Vỏ kim loại chắc chắn và bền bỉ',
'USB 3.0 tốc độ cao',
'Nhỏ gọn dễ dàng mang theo bên mình',
'Thiết kế không nắp kiểu dáng thời trangTương thích với hầu hết các hệ điều hành',
'Thiết kế mạnh mẽ',
'USB Kingston DT100G3 - 64GB - USB 3.0 mang trên mình lớp vỏ ngoài mạnh mẽ, vuông vắn với nền tảng nhựa nhám đen. Bốn cạnh được bo vát tròn hạn chế đâm chọt khi mang theo trong túi quần, túi áo. Phần đầu còn lại có rãnh xỏ dây cho phép bạn ghép đôi chiếc USB này đến những vật bất ly thân như chìa khóa chẳng hạn.',
'Tốc độ nhanh chóng với chuẩn 3.0',
'Sử dụng công nghệ USB 3.0 giúp truyền tải dữ liệu giữa máy tính và các thiết bị một cách nhanh chóng và an toàn nhất. Dùng lượng lưu trữ 64GB giúp bạn thoải mái trong việc lưu trữ và chia sẻ văn bản, âm nhạc, videos.',
'Nắp đậy an toàn, thời trang',
'Khác với kiểu USB đậy nắp thường thấy, USB Kingston 64GB DT100G3 có màn biến hình khá ấn tượng kiểu “ lên đạn súng lục” bằng cách trượt phần vỏ để lộ ra đầu giao tiếp 3.0 ẩn bên trong. Kiểu thiết kế này rất hữu ích khi không còn sợ thất lạc nắp đậy, giữ cho đầu giao tiếp được bảo bọc an toàn.',
'Tính năng Plug and Play',
'Bên cạnh đó, usb với tính năng Plug and Play, bạn chỉ cần cắm vào máy tính là có thể sử dụng không cần phải cài đặt bất kỳ phần mềm nào khác.',
'Khả năng tương thích cao',
'Kingston DT100G3 được trang bị cổng kết nối USB 3.0 giúp truyền tải dữ liệu với tốc độ nhanh gấp nhiều lần so với cổng 2.0. Đồng thời, cổng USB 3.0 cũng tương thích ngược với USB 2.0. Bạn có thể kết nối dễ dàng với thiết bị thông qua cổng USB 3.0 và sử dụng ngay mà không cần cài đặt bất kì phần mềm nào.',
'']
index = l.index("MÔ TẢ SẢN PHẨM")
remaining = l[index+1:]
value = ",".join(remaining)
dict = {"MÔ TẢ SẢN PHẨM" : value}
print(dict)
In this case we use ",".join(remaining) so that the "," will appear between the values that are in the sublist when converted to a string. Keep in mind that the last blank string will cause the value in the dictionary to end with a "," because of this.

Can use the .index method on the list to find the location of the value you're interested in, and then slice the list after that value:
split_from = "MÔ TẢ SẢN PHẨM"
# grab the index of the string we want to split on
at = l.index(split_from)
# grab anything after it, if the item is not empty
after_split = [c for c in l[at+1:] if c != '']
# join with commas
d = {split_from: ", ".join(after_split)}
print(d)

Related

Python pandas pass avarieble from inner loop to outer loop

I have a python code as below but I cant pass the variable of inner loop to outer loop.
Every time the inner loop breaks, the value of variable "x" reset to initial value.
import pandas as pd
import csv
user_list = pd.read_csv(r'C:\Users\Administrator\Desktop\user_list.csv')
domain_list = pd.read_csv(r'C:\Users\Administrator\Desktop\domainlist.csv')
x=1
y=0
for y in user_list.index:
print(user_list.iloc[y,0])
for x in domain_list.index:
print(domain_list.iloc[x,0])
x=x+1
if(x % 10 == 0):
break
print("out of loop, value of x is "+str(x))
below is my csv files
User_list
user1,pw1
user2,pw2
user3,pw3
Domain_list
burton.com
amazon.com
gizmodo.com
theverge.com
venturebeat.com
digitaltrends.com
mashable.com
theinformation.com
engadget.com
arstechnica.com
techcrunch.com
thenextweb.com
tomshardware.com
roblox.com
discord.com
office.com
tiktok.com
wikipedia.org
baidu.com
samsung.com
bilibili.com
duckduckgo.com
Desired output is as below
After User1 is printed, 1-10 website names are printed and then User2 is printed and 11-20 websites are printed
User1
burton.com
amazon.com
gizmodo.com
theverge.com
venturebeat.com
digitaltrends.com
mashable.com
theinformation.com
engadget.com
arstechnica.com
User2
techcrunch.com
thenextweb.com
tomshardware.com
roblox.com
discord.com
office.com
tiktok.com
wikipedia.org
baidu.com
samsung.com
Current output is as below
user1
burton.com
amazon.com
gizmodo.com
theverge.com
venturebeat.com
digitaltrends.com
mashable.com
theinformation.com
engadget.com
arstechnica.com
user2
burton.com
amazon.com
gizmodo.com
theverge.com
venturebeat.com
digitaltrends.com
mashable.com
theinformation.com
engadget.com
arstechnica.com
user3
burton.com
amazon.com
gizmodo.com
theverge.com
venturebeat.com
digitaltrends.com
mashable.com
theinformation.com
engadget.com
arstechnica.com
out of loop, value of x is 10
This is the correct behaviour, since once you go back to outer loop again, the inner loop starts from the begging.
You can do something like this, use another variable z and use it.
z=0
for y in user_list.index:
print(user_list.iloc[y,0])
for x in domain_list.index:
if len(domain_list)==z:
break
print(domain_list.iloc[z,0])
z=z+1
if(z % 10 == 0):
break
Output:
user1
burton.com
amazon.com
gizmodo.com
theverge.com
venturebeat.com
digitaltrends.com
mashable.com
theinformation.com
engadget.com
arstechnica.com
user2
techcrunch.com
thenextweb.com
tomshardware.com
roblox.com
discord.com
office.com
tiktok.com
wikipedia.org
baidu.com
samsung.com
user3
bilibili.com
duckduckgo.com
out of loop, value of x is 22

reads a textile using list as data class objects

I'm trying to solve a program called that reads a file of movie characters and creates a list of the movie characters (as data class objects). However I'm having some problem with it
so far I've come up with this
import os
from dataclasses import dataclass
#dataclass
class objects():
lst = []
fname: str = 'starwars.txt'
lst = []
char = objects()
with open(char.fname, "r") as path: # Reads the open file
for line in path:
x = line[:-1]
lst.append(x)
print(lst)
but I know I'm doing something wrong because I'm getting this output:
['Qui-Gon Jinn, Human, Coruscant', 'Han Solo, Human, Corellia', 'Leia Organa, Human, Alderaan', 'Luke Skywalker, Human, Tatooine', 'Chewbacca, Wookiee, Kashyyyk', 'Cassian Andor, Human, Kenari', 'Jar Jar Binks, Gungan, Naboo', 'Ahsoka Tano, Togruta, Shili', 'Plo Koon, Kel Dor, Dorin', 'Din Djarin, Human, Aq Vetina', 'Cad Bane, Duro, Duros', 'Max Rebo, Ortolan, Orto', 'Boba Fett, Human, Kamino', 'Jabba the Hutt, Hutt, Nal Hutta', 'Rey Skywalker, Human, Jakku']
When I'm supposed to get this output
Qui-Gon Jinn Human Coruscant
Han Solo Human Corellia
Leia Organa Human Alderaan
Luke Skywalker Human Tatooine
Chewbacca Wookiee Kashyyyk
Cassian Andor Human Kenari
Jar Jar Binks Gungan Naboo
Ahsoka Tano Togruta Shili
Plo Koon Kel Dor Dorin
Din Djarin Human Aq Vetina
Cad Bane Duro Duros
Max Rebo Ortolan Orto
Boba Fett Human Kamino
Jabba the Hutt Hutt Nal Hutta
Rey Skywalker Human Jakku
I don't really know what I'm doing wrong or if I'm even reading a file and creating list of the movie characters as data class objects.I would really appreciate the help
this works if your txt file is delimited by \n:
import os
from dataclasses import dataclass
#dataclass
class objects():
lst = []
fname: str = 'starwars.txt'
lst = []
char = objects()
with open(char.fname, "r") as file: # Reads the open file
for line in file:
tmp = line.strip().split('\n')[0].split(',')
lst.append(tmp)
for line in lst:
print(f'{line[0]}\t\t{line[1]}\t\t{line[2]}')
import pandas as pd
pd.DataFrame(lst)
# print list output
Qui-Gon Jinn Human Coruscant
Han Solo Human Corellia
Leia Organa Human Alderaan
Luke Skywalker Human Tatooine
Chewbacca Wookiee Kashyyyk
Cassian Andor Human Kenari
Jar Jar Binks Gungan Naboo
Ahsoka Tano Togruta Shili
Plo Koon Kel Dor Dorin
Din Djarin Human Aq Vetina
Cad Bane Duro Duros
Max Rebo Ortolan Orto
Boba Fett Human Kamino
Jabba the Hutt Hutt Nal Hutta
Rey Skywalker Human Jakku
# dataframe output
0 1 2
0 Qui-Gon Jinn Human Coruscant
1 Han Solo Human Corellia
2 Leia Organa Human Alderaan
3 Luke Skywalker Human Tatooine
4 Chewbacca Wookiee Kashyyyk
5 Cassian Andor Human Kenari
6 Jar Jar Binks Gungan Naboo
7 Ahsoka Tano Togruta Shili
8 Plo Koon Kel Dor Dorin
9 Din Djarin Human Aq Vetina
10 Cad Bane Duro Duros
11 Max Rebo Ortolan Orto
12 Boba Fett Human Kamino
13 Jabba the Hutt Hutt Nal Hutta
14 Rey Skywalker Human Jakku
pandas is a simple and intuitive tool for handling tables
if your txt file isn't dilimited by the \n then I would post a data sample to better represent a MRE
if you prefer to do it in an OO fashion...
#dataclass
class character():
name: str
species: str
origin: str
lst = []
char = objects()
with open(char.fname, "r") as file: # Reads the open file
for line in file:
tmp = line.strip().split('\n')[0].split(',')
individual = character(name = tmp[0], species = tmp[1], origin = tmp[2])
lst.append(individual)
output
[character(name='Qui-Gon Jinn', species=' Human', origin=' Coruscant'),
character(name='Han Solo', species=' Human', origin=' Corellia'),
character(name='Leia Organa', species=' Human', origin=' Alderaan'),
character(name='Luke Skywalker', species=' Human', origin=' Tatooine'),
character(name='Chewbacca', species=' Wookiee', origin=' Kashyyyk'),
character(name='Cassian Andor', species=' Human', origin=' Kenari'),
character(name='Jar Jar Binks', species=' Gungan', origin=' Naboo'),
character(name='Ahsoka Tano', species=' Togruta', origin=' Shili'),
character(name='Plo Koon', species=' Kel Dor', origin=' Dorin'),
character(name='Din Djarin', species=' Human', origin=' Aq Vetina'),
character(name='Cad Bane', species=' Duro', origin=' Duros'),
character(name='Max Rebo', species=' Ortolan', origin=' Orto'),
character(name='Boba Fett', species=' Human', origin=' Kamino'),
character(name='Jabba the Hutt', species=' Hutt', origin=' Nal Hutta'),
character(name='Rey Skywalker', species=' Human', origin=' Jakku')]

pandas count occurrences during time window on other dataframe

I have a dataframe with this pattern of events
df = {
'2017-11-28 11:00': 'event1',
'2017-11-28 11:01': 'event1',
'2017-11-28 11:02': 'event1', <-----
'2017-11-28 11:03': 'event2',
'2017-11-28 11:04': 'event2',
'2017-11-28 11:05': 'event1',
'2017-11-28 11:06': 'event1',
'2017-11-28 11:07': 'event1', <-----
'2017-11-28 11:08': 'event2',
'2017-11-28 11:09': 'event2',
'2017-11-28 11:10': 'event2',
}
What I want to do is, for every event1 followed by one or many event2s, count the number of these event2s occurring during a specified time window, say 3 mins after that event1.
The arrows indicate the beginning of the time window.
Any help please?
It looks like you have a series there. In which case you can do:
threshold = (s.index.to_series()
.groupby((s.eq('event1') & s.shift(-1).eq('event2')).cumsum())
.transform('min') + pd.to_timedelta('3Min') # adjust threshold here
)
(s.eq('event2') & (s.index < threshold)).sum()
# out 4

Integral of a distribution returns nan value

I have a distribution whose point on both axies are:
x = [21.381625583382622 ,21.201155495759807 ,21.008654068962123 ,20.90037201638843 ,20.888340677213577 ,20.701854920003328 ,20.62365121536677,
20.467243806093656 ,20.395055771044525 ,20.196538674659422 ,20.094272291673157,20.040131265386314 ,19.949896221574896 ,19.727316446840085,19.619034394266393 ,19.57090903756697 ,19.33028225406988 ,19.167859175209337 ,19.119733818509914 ,18.975357748411653 ,18.86707569583797 ,18.69863694739 ,18.620433242753442 ,18.578323555641447 ,18.27754007627008 ,18.235430389158086 ,18.169258023696383 ,17.99480360566099 ,17.86847454432501 ,17.76019249175132 ,17.639879100002773 ,17.519565708254223 ,17.278938924757128 ,17.309017272694263 ,17.122531515484013 ,16.990186784560613 ,16.875889062399487 ,16.749560001063514 ,16.64729361807725 ,16.50291754797899 ,16.394635495405296 ,16.26830643406932 ,16.11189902479621 ,16.03369532015965 ,15.91939759799853 ,15.76299018872542 ,15.648692466564295 ,15.540410413990605 ,15.408065683067202 ,15.221579925856952 ,15.071188186171264 ,15.071188186171264 ,14.87267108978616 ,14.75837336762504 ,14.674153993401056 ,14.553840601652508 ,14.409464531554251 ,14.253057122281138 ,14.19891609599429 ,14.036493017133752 ,13.843991590336074 ,13.789850564049226 ,13.669537172300679 ,13.513129763027564 ,13.392816371279016 ,13.266487309943043 ,13.140158248607065 ,12.869453117172833 ,12.82734343006084 ,12.64085767285059 ,12.496481602752333 ,12.370152541416356 ,12.261870488842664 ,12.093431740394694 ,12.003196696583283 ,11.94304000070901 ,11.75655424349876 ,11.600146834225647 ,11.497880451239382 ,11.407645407427971 ,11.19709697186801 ,11.088814919294316 ,10.992564205895478 ,10.830141127034938 ,10.7338904136361 ,10.595530013125268 ,10.469200951789292 ,10.33685622086589 ,10.180448811592775 ,10.07818242860651 ,9.957869036857963 ,9.807477297172277 ,9.687163905423729 ,9.560834844087754 ,9.452552791514059 ,9.29012971265352 ,9.1758319904924 ,9.073565607506133 ,8.953252215757583 ,8.814891815246753 ,8.54418668381252 ,8.441920300826254 ,8.297544230727997 ,8.225356195678867 ,8.050901777643471 ,7.9245727163074955 ,7.82230633332123 ,7.677930263222972 ,7.521522853949859 ,7.425272140551021 ,7.292927409627618 ,7.160582678704215 ,7.010190939018529 ,6.913940225619691 ,6.805658173045997 ,6.625188085423175 ,6.5409687111991905 ,6.4387023282129245 ,6.282294918939812 ,6.149950188016408 ,6.047683805030142 ,5.921354743694167 ,5.776978673595909 ,5.638618273085079 ,5.560414568448522 ,5.40400715917541 ,5.2716624282520055 ,5.127286358153748 ,5.0069729664052 ,4.874628235481797 ,4.730252165383538 ,4.603923104047563 ,4.49564105147387 ,4.321186633438475 ,4.218920250452209 ,4.086575519528806 ,3.9542307886054022 ,3.8218860576819993 ,3.6955569963460233 ,3.5692279350100478 ,3.4188361953243622 ,3.3045384731632415 ,3.196256420589548 ,3.0157863329667256 ,2.9014886108056044 ,2.7992222278193384 ,2.6668774968959355 ,2.534532765972532 ,2.402188035049129 ,2.2878903128880084 ,2.1435142427897502 ,1.993122503104065 ,1.8908561201177987 ,1.7585113891943958 ,1.6381979974458472 ,1.4998375969350168 ,1.3674928660116135 ,1.241163804675638 ,1.1148347433396621 ,0.9824900124162592 ,0.880223629429993 ,0.7298318897443077 ,0.6035028284083319 ,0.471158097484929 ,0.3388133665615254 ,0.21849997481297745 ,0.10420225265185667 ,-0.022126808684119315 ,-0.17251854836980485 ,-0.2868162705309256 ,-0.395098323104619 ,-0.5575214019651598 ,-0.7018974720634175 ,-0.8041638550496835 ,-0.930492916385659 ,-1.056821977721635 ,-1.1951823782324649 ,-1.3215114395684413 ,-1.441824831316989 ,-1.616279249352385 ,-1.7185456323386505 ,-1.850890363262054 ,-1.9651880854231747 ,-2.097532816346578 ,-2.2419088864448353 ,-2.3682379477808118 ,-2.512614017879069 ,-2.6329274096276176 ,-2.7291781230264567 ,-2.9036325410618513 ,-3.011914593635545 ,-3.1382436549715216 ,-3.276604055482351 ,-3.4149644559931813 ,-3.529262178154302 ,-3.64957556990285 ,-3.799967309588536 ,-3.93231204051194 ,-4.034578423498205 ,-4.172938824009036 ,-4.341377572457003 ,-4.455675294618124 ,-4.563957347191818 ,-4.714349086877503 ,-4.852709487388334 ,-4.9549758703746 ,-5.081304931710576 ,-5.243728010571116 ,-5.358025732732237 ,-5.466307785305931 ,-5.62715194579043 ,-5.730997247152738 ,-6.00170237858697 ,-6.140062779097802 ,-6.2603761708463495 ,-6.380689562594897 ,-6.494987284756018 ,-6.657410363616558 ,-6.777723755365107 ,-6.904052816701082 ,-7.042413217211912 ,-7.180773617722744 ,-7.271008661534154 ,-7.409369062044986 ,-7.55976080173067 ,-7.6860898630666465 ,-7.800387585227767 ,-7.962810664088307 ,-8.107186734186566 ,-8.191406108410549 ,-8.32976650892138 ,-8.456095570257354 ,-8.582424631593332 ,-8.672659675404743 ,-8.79297306715329 ,-9.015552841888105 ,-9.117819224874372 ,-9.208054268685784 ,-9.364461677958897 ,-9.484775069707442 ,-9.611104131043419 ,-9.695323505267403 ,-9.875793592890226 ,-10.020169662988483 ,-10.080326358862758 ,-10.26079644648558 ,-10.375094168646703 ,-10.501423229982677 ,-10.65783063925579 ,-10.760097022242057 ,-10.904473092340314 ,-11.024786484088862 ,-11.139084206249985 ,-11.337601302635088 ,-11.373695320159651 ,-11.578228086132183 ,-11.830886208804134 ,-11.95721527014011 ,-12.035418974776668 ,-12.26401441909891 ,-12.408390489197167 ,-12.40237481960974 ,-12.612923255169699 ,-12.751283655680531 ,-12.84753436907937 ,-12.991910439177627 ,-13.12425517010103 ,-13.23855289226215 ,-13.334803605660989 ,-13.503242354108957 ,-13.707775120081488 ,-13.791994494305476 ,-13.88824520770431 ,-14.056683956152279 ,-14.189028687075682 ,-14.309342078824232 ,-14.4777808272722 ,14.598094219020746 ,-14.724423280356723 ,-14.77856430643569 ,-15.019191090140664 ,-15.049269438077802 ,-15.19364550817606 ,-15.33200590868689 ,-15.494428987547431 ,-15.602711040121127 ,-15.692946083932535 ,-15.843337823618223 ,-16.077948937527893 ,-16.132089963814735 ,-16.234356346801 ,-16.38448086486688 ,-16.517092817410095 ,-16.607327861221506 ,-16.727641252970052]
y = [ 14.0 ,20.0 ,16.0 ,12.0 ,8.0 ,12.0 ,22.0 ,16.0 ,18.0 ,24.0 ,17.0 ,22.0 ,15.0 ,13.0 ,16.0 ,30.0 ,16.0 ,9.0 ,11.0 ,4.0 ,9.0 ,24.0 ,22.0 ,11.0 , 11.0 ,0.0 ,7.0 ,11.0 ,8.0, 14.0 ,13.0 ,9.0 ,4.0 ,33.0 ,27.0 ,27.0 ,26.0 ,32.0 ,18.0 ,23.0 ,26.0 ,27.0 ,21.0 ,17.0 ,33.0 ,27.0 ,32.0 ,24.0 ,31.0 ,34.0 ,14.0 ,27.0 ,22.0 ,26.0 ,17.0 ,22.0 ,21.0 ,11.0 ,37.0 ,24.0 ,34.0 ,20.0 ,29.0 ,26.0 ,25.0 ,34.0 ,26.0 ,12.0 ,28.0 ,18.0 ,20.0 ,20.0 ,25.0 ,18.0 ,36.0 ,22.0 ,20.0 ,29.0 ,19.0 ,17.0 ,16.0 ,6.0 ,17.0 ,11.0 ,25.0 ,12.0 ,21.0 ,31.0 ,29.0 ,20.0 ,11.0 ,9.0 ,0.0 ,21.0 ,24.0 ,8.0 ,12.0 ,6.0 ,16.0 ,24.0 ,17.0 ,16.0 ,10.0 ,18.0 ,15.0 ,3.0 ,8.0 ,12.0 ,10.0 ,11.0 ,7.0 ,16.0 ,12.0 ,30.0 ,23.0 ,27.0 ,28.0 ,33.0 ,29.0 ,27.0 ,25.0 ,44.0 ,40.0 ,47.0 ,48.0 ,55.0 ,75.0 ,75.0 ,71.0 ,91.0 ,92.0 ,83.0 ,120.0 133.0 ,162.0 ,163.0 ,187.0 ,237.0 ,262.0 ,306.0 ,316.0 ,385.0 ,417.0 ,474.0 597.0 ,639.0 ,687.0 ,780.0 ,868.0 ,953.0 ,1079.0 ,1187.0 ,1279.0 ,1431.0 ,1628.0 ,1875.0 ,2180.0 ,2542.0 ,2988.0 ,3406.0 ,3890.0 ,4356.0 ,4824.0 ,5222.0 ,5621.0 ,5834.0 ,5937.0 ,5875.0 ,5838.0 ,5578.0 ,5269.0 ,4847.0 ,4403.0 ,3773.0 ,3335.0 ,2934.0 ,2420.0 ,2132.0 ,1873.0 ,1612.0 ,1425.0 ,1264.0 ,1173.0 ,1030.0 ,925.0 ,857.0 ,768.0 ,684.0 ,614.0 , 523.0 ,491.0 ,422.0 ,397.0 ,339.0 ,281.0 ,236.0 ,227.0 ,202.0 ,155.0 ,155.0 ,116.0 ,101.0 ,106.0 ,96.0 ,90.0 ,68.0 ,65.0 ,66.0 ,61.0 ,58.0 ,44.0 ,37.0 ,39.0 ,32.0 ,40.0 ,40.0 ,27.0 ,33.0 ,30.0 ,19.0 ,17.0 ,31.0 ,23.0 ,42.0 ,14.0 ,26.0 ,22.0 ,15.0 ,10.0 ,22.0 ,20.0 ,18.0 ,28.0 ,23.0 ,26.0 ,14.0 ,9.0 ,17.0 ,11.0 ,15.0 ,24.0 ,25.0 ,3.0 ,10.0 ,25.0 ,9.0 ,23.0 ,16.0 ,7.0 ,28.0 ,14.0 ,20.0 ,13.0 ,11.0 ,14.0 ,22.0 ,19.0 ,11.0 ,15.0 ,25.0 ,28.0 ,28.0 ,26.0 ,12.0 ,28.0 ,28.0 ,10.0 ,13.0 ,11.0 ,37.0 ,5.0 ,26.0 ,20.0 ,15.0 ,32.0 ,24.0 ,13.0 , 29.0 ,28.0 ,22.0 ,36.0 ,36.0 ,26.0 ,27.0 ,25.0 ,27.0 ,30.0 ,35.0 ,35.0 ,35.0 ,19.0 ,26.0 ,23.0 ,24.0 ,32.0]
I want to evaluate the area under the distribution, this is the code I've used:
area = simps(y,x)
But if I run it, it gives me this error:
RuntimeWarning: divide by zero encountered in true_divide
y[slice1]hsumhsum/hprod +
RuntimeWarning: invalid value encountered in add y[slice1]hsumhsum/hprod +
I've tried to print the value of the area but it returns nan value.
Can anyone help me please?
I've run your code for myself, and found this raised errors.
I could recommend you to use trapz method instead of simps.
But be careful firstly read about mathematical background for this two functions
How to decide between scipy.integrate.simps or numpy.trapz?.
If trapz will be suite for you, use it :)

Python "not in" index out of range enrror

I am dealing with some kind of problem and i could not find any solution.
My problem is I am controlling a value in a nested list if it is not in another list and deleting it if it is not there but in the not in line it gives me an error like index out of range.
def heroes_updater(men_pref,women):
for i in range(0,len(men_pref)-1):
for j in range(0,len(men_pref[i])-1):
if men_pref[i][j] not in women:
men_pref[i]=men_pref[i][:j]+men_pref[i][j+1:]
example men_pref:
[['Storm', 'Black Widow', 'Scarlet Witch', 'Rouge', 'Mystique', 'Jean Grey', 'Ms. Marvel', 'Gamora', 'Invisible Woman', 'Elektra'], ['Storm', 'Elektra', 'Jean Grey', 'Scarlet Witch', 'Mystique', 'Ms. Marvel', 'Gamora', 'Rouge', 'Black Widow', 'Invisible Woman'], ['Invisible Woman', 'Scarlet Witch', 'Mystique', 'Black Widow', 'Ms. Marvel', 'Elektra', 'Jean Grey', 'Gamora', 'Storm', 'Rouge']]
example women:
['Jean Grey', 'Elektra', 'Mystique', 'Ms. Marvel', 'Rouge']
And the error is :
if men_pref[i][j] not in women:
IndexError: list index out of range
By removing elements from your list, the list gets shorter j is larger than the length of the list. To circumvent this problem, just don't alter the lists, but create a new one:
def heroes_updater(men_pref,women):
result = []
for prefs in men_pref:
new_prefs = []
for pref in prefs:
if pref in women:
new_prefs.append(pref)
result.append(new_prefs)
men_pref[:] = result
or better:
def filter_non_heroes(men_pref,women):
return [
[pref for pref in prefs if pref in women]
for prefs in men_pref
]
You're editing the list you're reading, you must never do that.
With the line men_pref[i]=men_pref[i][:j]+men_pref[i][j+1:]
you're removing an item from the list men_pref[i], but your j variable goes from 0 to the original lenght of the list, so you'll eventually have an index error when you check for men_pref[i][j] if j>len(men_pref[i])
EDIT:
Of, if you want to edit your current list, then you'll have to read it with a backwards index (you start from the last, if it's not on the list of women, you remove it and then continue with the next item):
def heroes_updater(men_pref,women):
for i in range(len(men_pref)-1, -1,-1):
for j in range(len(men_pref[i])-1, -1, -1):
if men_pref[i][j] not in women:
men_pref[i].pop(j)
# An alternative: del(mem_pref[i][j])
Another way would be to use list comprehension:
def heroes_updater(men_pref,women):
for i in range(len(men_pref)-1, -1,-1):
mem_pref[i] = [_w_ for _w_ in mem_pref[i] if _w_ in women]
There are other options, but I'll leave that to you.
That's how you learn.
You can use a set with a list comp, you cannot iterate over and mutate a list as each time you remove an element the list gets smaller and your index is based on what the size of the list when you started the range:
men = [['Storm', 'Black Widow', 'Scarlet Witch', 'Rouge', 'Mystique', 'Jean Grey', 'Ms. Marvel', 'Gamora', 'Invisible Woman', 'Elektra'], ['Storm', 'Elektra', 'Jean Grey', 'Scarlet Witch', 'Mystique', 'Ms. Marvel', 'Gamora', 'Rouge', 'Black Widow', 'Invisible Woman'], ['Invisible Woman', 'Scarlet Witch', 'Mystique', 'Black Widow', 'Ms. Marvel', 'Elektra', 'Jean Grey', 'Gamora', 'Storm', 'Rouge']]
wom = {'Jean Grey', 'Elektra', 'Mystique', 'Ms. Marvel', 'Rouge'}
men[:] = [[ele for ele in sub if ele in wom] for sub in men]
print(men)
Or functionally if order is irrelevant:
men = [['Storm', 'Black Widow', 'Scarlet Witch', 'Rouge', 'Mystique', 'Jean Grey', 'Ms. Marvel', 'Gamora', 'Invisible Woman', 'Elektra'], ['Storm', 'Elektra', 'Jean Grey', 'Scarlet Witch', 'Mystique', 'Ms. Marvel', 'Gamora', 'Rouge', 'Black Widow', 'Invisible Woman'], ['Invisible Woman', 'Scarlet Witch', 'Mystique', 'Black Widow', 'Ms. Marvel', 'Elektra', 'Jean Grey', 'Gamora', 'Storm', 'Rouge']]
wom = {'Jean Grey', 'Elektra', 'Mystique', 'Ms. Marvel', 'Rouge'}
men[:] = map(list,map(wom.intersection, men))
print(men)
You could also start from the end of the list, using your range logic but using range(len(sub)-1,-1, -1) but it is easier to just to use reversed and iterate over the elements themselves:
def heroes_updater(men_pref, women):
for sub in men_pref:
for m in reversed(sub):
if m not in women:
sub.remove(m)

Categories

Resources