I have the below dictionary and I attempted to remove duplicates using the below piece of code.
vertex = {1: (4.0,7.0), 2: (1.0,4.0), 3: (5.0,8.0), 4: (5.0,6.0), 5: (3.0,8.0), 6: (4.0,7.0), 7: (1.0,4.0), 8: (5.0,8.0), 9: (4.0,2.0), 10: (4.0,8.0), 11: (4.0,7.0), 12: (4.0,2.0), 13: (4.0,8.0), 14: (1.0,4.0), 15: (5.0,8.0), 16: (4.0,4.0), 17: (4.0,2.0), 18: (4.0,8.0), 19: (2.0,2.0), 20: (5.0,5.0), 21: (4.0,7.0), 22: (4.0,2.0), 23: (4.0,8.0), 24: (5.0,6.0), 25: (3.0,8.0)}
result = {}
for key,value in vertex.items():
if value not in result.values():
result[key] = value
print result
The duplicate values are still getting added to result.
[] (4.0,7.0) - initial result and value to be checked if its already in result
[(4.0,7.0)] (1.0,4.0)
[(4.0,7.0), (1.0,4.0)] (5.0,8.0)
[(4.0,7.0), (1.0,4.0), (5.0,8.0)] (5.0,6.0)
[(4.0,7.0), (1.0,4.0), (5.0,8.0), (5.0,6.0)] (3.0,8.0)
[(4.0,7.0), (1.0,4.0), (5.0,8.0), (5.0,6.0), (3.0,8.0)] (4.0,7.0) - here (4.0,7.0) is being checked and its getting added though it is already there in it as shown in next step.
[(4.0,7.0), (1.0,4.0), (5.0,8.0), (5.0,6.0), (3.0,8.0), (4.0,7.0)] (1.0,4.0)
Can anyone tell me where exactly it goes wrong? I am unable to figure that out!
Thanks.
Since you are dealing with unique tuples, set() can perform better in this case. Try this:
vertex_set = set()
results = {}
for key, value in vertex.items():
if not value in vertex_set:
result[key] = value
vertex_set.add(value)
For more on sets, refer https://docs.python.org/2/library/sets.html
Related
Example: List of List =
[
[4, 175.52, 00, 175.52, 175.52],
[3, 175.52, 01, 175.52, 175.52]
]
1 = A
2 = B
3 = C
4 = D
And
00 = AA
01 = BB
12 = CC
15 = DD
I know I can use for loop and replace example in first item like:
4 to D and 00 to AA
Expected result:
[
[D, 175.52, AA, 175.52, 175.52],
[C, 175.52, BB, 175.52, 175.52]
]
So, How to replace List item value with certain condition?
This is a weird question so I'm not sure if this is what you're looking for:
void main() {
List<List<num>> bigList = [
[4, 175.52, 00, 175.52, 175.52],
[3, 175.52, 01, 175.52, 175.52]
];
List<List<dynamic>> newBigList = [];
for (List<num> smallList in bigList) {
List<dynamic> newSmallList = [];
for (num number in smallList) {
switch (number) {
case 1:
newSmallList.add("A");
break;
case 2:
newSmallList.add("B");
break;
case 3:
newSmallList.add("C");
break;
case 4:
newSmallList.add("D");
break;
case 00:
newSmallList.add("AA");
break;
case 01:
newSmallList.add("BB");
break;
case 12:
newSmallList.add("CC");
break;
case 15:
newSmallList.add("DD");
break;
default:
newSmallList.add(number);
}
}
newBigList.add(newSmallList);
}
print(newBigList);
}
This prints:
[[D, 175.52, AA, 175.52, 175.52], [C, 175.52, A, 175.52, 175.52]]
My question was replace the first (item(0)) and third (item(2)) in the this list. [4, 175.52, 00, 175.52, 175.52]. above post #mans gave me the correct answer. Differences is that in his solution you can replace every item in list if it meets the certain condition. In my problem is similar but replace only 2 items. I use if else statement before switch condition to get what I need.
void main() {
List<List<dynamic>> bigList = [
[2, 175.52, 00, 175.52, 175.52],
[3, 175.52, 01, 175.52, 175.52]
];
List<List<dynamic>> newBigList = [];
for (List<dynamic> smallList in bigList) {
List<dynamic> newSmallList = [];
for (var number in smallList) {
if (number == smallList[0]) {
switch (number) {
case 1:
newSmallList.add("A");
break;
case 2:
newSmallList.add("B");
break;
case 3:
newSmallList.add("C");
break;
case 4:
newSmallList.add("D");
break;
default:
newSmallList.add(number);
}
} else if (number == smallList[2]) {
switch (number) {
case 00:
newSmallList.add("AA");
break;
case 01:
newSmallList.add("BB");
break;
case 12:
newSmallList.add("CC");
break;
case 15:
newSmallList.add("DD");
break;
default:
newSmallList.add(number);
}
} else {
newSmallList.add(number);
}
// if else
} // inner for
newBigList.add(newSmallList);
} // outer for
print(newBigList);
}
I want to using case on if statement, can I use it? Because I always got error when i compile it ;w;
Error I got:
Tahun.pas(26,21) Fatal: Syntax error, ";" expected but "ELSE" found
Tahun.pas(0) Fatal: Compilation aborted
Here my code:
uses Crt;
var
sisa, bulan, tahun : integer;
begin
ClrScr;
writeln('masukkan tahun'); read(tahun);
sisa := tahun mod 4;
if sisa =0 then
writeln('masukkan bulan 1-12'), read(bulan);
case bulan of
1: write('31');
2: write('29');
3: write('31');
4: write('30');
5: write('31');
6: write('30');
7: write('31');
8: write('30');
9: write('31');
10: write('30');
11: write('31');
12: write('30');
else write('bulan tidak lebih dari 12');
end;
else
writeln('masukkan bulan 1-12'), read(bulan);
case bulan of
1: write('31');
2: write('28');
3: write('31');
4: write('30');
5: write('31');
6: write('30');
7: write('31');
8: write('30');
9: write('31');
10: write('30');
11: write('31');
12: write('30');
else write('bulan tidak lebih dari 12')
end;
readln;
readln;
end.
Or maybe you know how to improve the code? ;w;
Thank you for answering ;w;
I hope you have read the links upon the pieces of advice given in the comments yesterday. So there are several possible answers to the question:
The 1st – to repair your code:
begin
writeln('masukkan tahun');
readln(tahun);
writeln('masukkan bulan 1-12');
readln(bulan);
case bulan of
1, 3, 5, 7, 8, 10, 12: writeln('31');
2: if tahun mod 4 = 0 then
writeln('29')
else
writeln('28');
4, 6, 9, 11: writeln('30');
else
write('bulan tidak lebih dari 12');
end;
readln;
end.
2nd – to optimize it:
const
DinM: array [boolean, 1 .. 12] of byte =
((31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31));
begin
writeln('masukkan tahun');
readln(tahun);
writeln('masukkan bulan 1-12');
readln(bulan);
writeln(DinM[tahun mod 4 = 0, bulan]);
readln;
end.
And 3rd:
Use predesigned functions: Delphi has a function DaysInAMonth described here.
Lazarus has it as well.
Note
Remember that all these methods (including standard functions) will give an error calculating leap years as not all years that year mod 4 = 0 are leap. For example year 1700, 1800, 1900, 2100 etc. are not leap.
I am using the ListEach Function to comma separate the values from two different values.
like this:
<cfscript>
result = [];
listEach(form.getselection, function(value, index) {
switch (value) {
case "-2":
result.append(listLast(ListGetAt(form.get_items, index), "~"));
break;
case "-1":
result.append(ListGetAt(getselectiontext, index,',',true));
break;
default:
result.append(value);
}
});
</cfscript>
here is what the values look like
GETSELECTION -2,105.0000,-1,-1,-2
GETSELECTIONTEXT ,450,455
GET_ITEMS 128177000001304041~ mytext~YES~41.47,128177000001518319~mytext2~YES~91.52,128177000001518343~mytext3~YES~242.53,128177000001460287~mytext4~YES~15.0,128177000001304009~mytext5~YES~125.84
So, concatenating both, I want to get the values as:
41.47,105.0000,450,455,25.84
but somehow the values in the getselectiontext is causing me trouble, I am getting the following error:
The following information is meant for the website developer for debugging purposes.
Error Occurred While Processing Request
Invalid list index 3.
In function ListGetAt(list, index [, delimiters]), the value of index, 3, is not a valid as the first argument (this list has 2 elements). Valid indexes are in the range 1 through the number of elements in the list.
The error occurred in C:/inetpub/wwwroot/myproject/secure/portal.cfm: line 56
54 : break;
55 : case "-1":
56 : result.append(ListGetAt(getselectiontext, index,','));
57 : break;
58 : default:
Your second list {getselectiontext} contains 2 items which are fever than 5 items in {getselection} on which you are iterating with ListEach.
in case "-1", you are trying to get a list item from {getselectiontext} at index 3 or index 4 which do not exist.
You need to review the data being submitted and how it's being submitted via form.
I've got a list of owner names in all caps that I'd like to convert to proper capitalization:
owner1
1: DXXXXX JOSEPH V JR
2: MIRNA NXXXXX
3: ADRIAN TXXXX
4: CUTLER PXXXXXXXXX LLC
5: GVM PXXXXXXXXX LLC
6: EARLENA RXXXXXXX
7: NATHANIEL TXXXXX
8: DXXXXXX DONNA
9: LXXXX ELAINE E TR
10: SXXXXXX KIMBERLY
(for reproduction purposes:
owner1<-c("DXXXXX JOSEPH V JR","MIRNA NXXXXX","ADRIAN TXXXX",
"CUTLER PXXXXXXXXX LLC","GVM PXXXXXXXXX LLC",
"EARLENA RXXXXXXX","NATHANIEL TXXXXX","DXXXXXX DONNA",
"LXXXX ELAINE E TR","SXXXXXX KIMBERLY")
)
Desired output:
owner1
1: Dxxxxx Joseph V. Jr
2: Mirna Nxxxxx
3: Adrian Txxxx
4: Cutler Pxxxxxxxxx LLC
5: GVM Pxxxxxxxxx LLC
6: Earlena Rxxxxxxx
7: Nathaniel Txxxxx
8: Dxxxxxx Donna
9: Lxxxx Elaine E. TR
10: Sxxxxxx Kimberly
A big first step is a version of the .simpleCap function mentioned in ?chartr:
.simpleCap <- function(x) {
s <- strsplit(tolower(x), " ")[[1]]
paste(toupper(substring(s, 1, 1)), substring(s, 2),
sep = "", collapse = " ")
}
This is a large chunk of the problem, but fails on 4, 5 and 9. I can supplement this to treat key phrases (LLC, TR, etc.) separately, but this still leaves something like observation 5.
Here's the function I've got so far (sped up wonderfully by #eipi10's solution below, which vectorized the .simpleCap function, allowing the whole function to be applied to vectors):
to.proper<-function(strings){
#vectorized version of .simpleCap;
# I've also built in that I know `strings` is all caps
res<-gsub("\\b([A-Z])([A-Z]+)*","\\U\\1\\L\\2",strings,perl=T)
#In my data, some Irish/Scottish names separated the MC prefix
# Also, re-capitalize following a hyphen
res<-gsub("\\bMc\\s","Mc",gsub("(-.)","\\U\\1",res,perl=T))
for (init in c("[A-Z]","Inc","Assoc","Co",
"Jr","Sr","Tr","Bros")){
#Add a period after common abbreviations
res<-gsub(paste0("\\b(",init,")\\b"),"\\1.",res)
}
for (abbr in c("[B-DF-HJ-NP-TV-XZ][b-df-hj-np-tv-xz]{2,}",
"Pa","Ii","Iii","Iv","Lp","Tj",
"Xiv","Ll","Yml","Us")){
#Re-capitalize any string of >=3 consonants (excluding
# Y for such names as LYNN and WYNN), as well as
# some other common phrases that need upper-casing
res<-gsub(paste0("\\b(",abbr,")\\b"),"\\U\\1",res,perl=T)
}
#Re-capitalize post-Mc letters, e.g. in Mcmahon
gsub("\\bMc([a-z])","Mc\\U\\1",res,perl=T)
}
Any ideas for robust-ish ways to leave potentially unpredicted abbreviations alone in this process (particularly, like those in observation 5 which are uncommon)?
Here's a function using a Regex to convert strings to title case (adapted from #BenBolker's answer to a question I asked on SO a while back).
The function is written so that you can pass an argument called exceptions that deals with special cases like GVM. I'm not sure if this is flexible enough for your needs, since you have to hard-code the exceptions, but I thought I'd post it and see if anyone can suggest improvements.
dat = data.frame(owner1 = c("DXXXXX JOSEPH V JR","MIRNA NXXXXX","ADRIAN TXXXX",
"CUTLER PXXXXXXXXX LLC","GVM PXXXXXXXXX LLC",
"EARLENA RXXXXXXX","NATHANIEL TXXXXX","DXXXXXX DONNA",
"LXXXX ELAINE E TR","SXXXXXX KIMBERLY"))
# Convert a string to title case
tc = function(strings, exceptions="\\b(gvm)\\b") {
# Convert to title case, excluding terminal LLC, TR, etc.
title.case = gsub("\\b([a-zA-Z])([a-zA-Z]+)*( LLC| TR| FBO| LP)?",
"\\U\\1\\L\\2\\U\\3", strings, perl=TRUE)
# Add a period after initials (presumed to be any lone capital letter)
title.case = gsub(" ([A-Z]) ", " \\1\\. ", title.case)
# Deal with exceptions
title.case = gsub(exceptions, "\\U\\1", title.case, perl=TRUE, ignore.case=TRUE)
return(title.case)
}
dat$title.case = tc(dat$owner1)
owner1 title.case
1 DXXXXX JOSEPH V JR Dxxxxx Joseph V. Jr
2 MIRNA NXXXXX Mirna Nxxxxx
3 ADRIAN TXXXX Adrian Txxxx
4 CUTLER PXXXXXXXXX LLC Cutler Pxxxxxxxxx LLC
5 GVM PXXXXXXXXX LLC GVM Pxxxxxxxxx LLC
6 EARLENA RXXXXXXX Earlena Rxxxxxxx
7 NATHANIEL TXXXXX Nathaniel Txxxxx
8 DXXXXXX DONNA Dxxxxxx Donna
9 LXXXX ELAINE E TR Lxxxx Elaine E. TR
10 SXXXXXX KIMBERLY Sxxxxxx Kimberly
Whilst going through the Joy of Clojure book, I've succeedding in defining a function that, when invoked, will create and draw on a java.awt.Frame.
(defn draw-frame [f x y]
(let [frame (java.awt.Frame.)]))
However, simply defining the function in a new Leiningen REPL in a new empty Leiningen project causes the AWT framework to start. I say this, as entering the above function definition causes a new OS X 'window' to open with a 'main' menu option. If I close this window, the clojure REPL exits.
Otherwise, the function continues to behave as expected, but I'm keen to understand why this happens - creating a similar function in Java (referencing but not instantiating a java.awt.Frame) does not do exhibit the same symptoms.
Doing a bit of spelunking through rt.jar, I was able to track it down a bit.
The static initializer[1] for java.awt.Frame looks like:
0: iconst_0
1: putstatic #20 // Field nameCounter:I
4: invokestatic #114 // Method java/awt/Toolkit.loadLibraries:()V
7: invokestatic #115 // Method java/awt/GraphicsEnvironment.isHeadless:()Z
10: ifne 16
13: invokestatic #116 // Method initIDs:()V
16: new #117 // class java/awt/Frame$1
19: dup
20: invokespecial #118 // Method java/awt/Frame$1."<init>":()V
23: invokestatic #119 // Method sun/awt/AWTAccessor.setFrameAccessor:(Lsun/awt/AWTAccessor$FrameAccessor;)V
26: return
I was able to reproduce the behavior by executing java.awt.Toolkit at the REPL, so I dug into that static initializer too:
0: ldc_w #150 // class java/awt/Toolkit
3: invokevirtual #151 // Method java/lang/Class.desiredAssertionStatus:()Z
6: ifne 13
9: iconst_1
10: goto 14
13: iconst_0
14: putstatic #126 // Field $assertionsDisabled:Z
17: iconst_0
18: putstatic #84 // Field loaded:Z
21: new #152 // class java/awt/Toolkit$3
24: dup
25: invokespecial #153 // Method java/awt/Toolkit$3."<init>":()V
28: invokestatic #32 // Method java/security/AccessController.doPrivileged:(Ljava/security/PrivilegedAction;)Ljava/lang/Object;
31: pop
32: invokestatic #154 // Method loadLibraries:()V
35: invokestatic #155 // Method initAssistiveTechnologies:()V
38: invokestatic #156 // Method java/awt/GraphicsEnvironment.isHeadless:()Z
41: ifne 47
44: invokestatic #157 // Method initIDs:()V
47: return
loadLibraries seemed interesting, so that disassembly looks like:
0: getstatic #84 // Field loaded:Z
3: ifne 23
6: new #85 // class sun/security/action/LoadLibraryAction
9: dup
10: ldc #86 // String awt
12: invokespecial #87 // Method sun/security/action/LoadLibraryAction."<init>":(Ljava/lang/String;)V
15: invokestatic #32 // Method java/security/AccessController.doPrivileged:(Ljava/security/PrivilegedAction;)Ljava/lang/Object;
18: pop
19: iconst_1
20: putstatic #84 // Field loaded:Z
23: return
Rewriting the core bit of that in Clojure looks like:
(doto (sun.security.action.LoadLibraryAction. "awt")
(java.security.AccessController/doPrivileged))
Running this causes the same application to pop up, so my suspicion is that the native library has initializer code that causes it. Unfortunately, I don't feel like diving into real disassembly, so someone else will have to figure it out from that point!
[1]: I unpacked rt.jar and then used javap -p -c Foo.class to see this.